抑制嵌套异常

时间:2018-06-13 23:05:33

标签: python-3.x exception-handling

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

我想将第一个异常标记为已处理,以便第二个异常不与#34; 链接到第一个异常在处理上述异常期间,发生了另一个异常&#34;式。

我在这个简单的例子中意识到,我可以通过创建一个标志条件,退出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

但我并不是在寻找任何&#34;重组代码&#34;解决方案,我宁愿不使用try ... except ... try ... except ... raise ... from None,只是为了再次提出异常来捕获异常。我很好奇,如果有什么我可以放在这一点:

except ConnectionRefusedError as connection_refused:
    # connection_refused.handled = True

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

0 个答案:

没有答案