python-3.x - 抑制嵌套异常
问题描述
在块的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
它可以将异常标记为已完全处理。
解决方案
推荐阅读
- apache-superset - Apache Superset:sqllab - 结果后端未配置
- ansible - 如何在ansible中扩展dict,而不是覆盖它?
- python - 为什么在`id(i) is id(j)`中“is”运算符的行为与预期不同?
- android - Android Studio 无法链接到 -l1
- angular - Angular 7:setTimeout 方法在选择标签中不起作用
- android - 将数据返回到recyclerview
- python - 读取csv python时列出索引超出范围
- java - java导入是否专业使用?
- python - 为什么这个 Python“循环代码”不起作用?
- reactjs - 如何防止来自ckeditor的数据破坏页面的html?