在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
可以将异常标记为完全处理。