首页 > 解决方案 > 抑制嵌套异常

问题描述

在块的except子句中try...except,有没有办法将当前异常标记为已处理,所以如果在 except 块中引发另一个异常,它不会将新异常链接到旧异常?

例子:

from time import sleep

def connect(server):
    print("Attempting to connecting to", server)
    sleep(2)
    raise ConnectionRefusedError("Couldn't connect")
    print("Connected to", server)

try:
    conn = connect('main-server')
except ConnectionRefusedError as connection_refused:
    # connection_refused.handled = True
    conn = connect('backup-server')

这会产生:

Traceback (most recent call last):
  File "<pyshell#37>", line 2, in <module>
    conn = connect('main-server')
  File "<pyshell#26>", line 2, in connect
    raise ConnectionRefusedError("Couldn't connect")
ConnectionRefusedError: Couldn't connect

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#37>", line 4, in <module>
    conn = connect('backup-server')
  File "<pyshell#26>", line 2, in connect
    raise ConnectionRefusedError("Couldn't connect")
ConnectionRefusedError: Couldn't connect

我想将第一个异常标记为已处理,以便第二个异常不会通过“在处理上述异常期间,发生另一个异常”仪式链接到第一个异常。

我意识到在这个简单的示例中,我可以通过创建标志条件、退出except子句、测试标志和恢复恢复代码来做到这一点。

try:
    conn = connect('main-server')
except ConnectionRefusedError:
    conn = None

if not conn:
    conn = connect('backup-server')

或使用for...else构造:

for server in ('main-server', 'backup-server'):
    try:
        conn = connect(server)
        break
    except ConnectionRefusedError:
        continue
else:
    raise ConnectionRefusedError("Couldn't connect to any server")

最后,我知道我可以将异常处理程序包装在一个try...except块中,并用于raise...from None隐藏第一个异常。

try:
    conn = connect('main-server')
except ConnectionRefusedError:
    try:
        conn = connect('backup-server')
    except ConnectionRefusedError as nested:
        raise nested from None

但我不是在寻找任何“重构代码”解决方案,我宁愿不使用try ... except ... try ... except ... raise ... from None, 捕获异常来再次引发它。我很好奇此时我是否可以放置任何东西:

except ConnectionRefusedError as connection_refused:
    # connection_refused.handled = True

它可以将异常标记为已完全处理。

标签: python-3.xexception-handling

解决方案


推荐阅读