我的代码有点像这样:
try:
# do stuff
except SomeSpecificException as sse:
if sse.some_property == some_special_value:
# handle the exception in a special way
else:
handle_exception_normally()
except:
handle_exception_normally()
我想捕获特定的异常并以特殊的方式处理它,但前提是它具有特定的属性。如果它没有该属性,我希望它像任何其他异常(日志记录、尖叫等)一样被处理
上面的代码可以工作,但如果可能的话,我想避免重复handle_exception_normally()
(DRY等等)。
仅将 raise
放在第一个 except
block 的 else
子句中是行不通的。父 try
block 会捕获该情况,但同一 block 中的 catch-all 子句不会。
我可以嵌套两个 try
block ,但这不是很优雅;我宁愿只用
我上面的代码。
有更好的方法吗?
请注意,我使用的是 Python 3。
最佳答案
我会选择:
try:
# do stuff
except Exception as e:
if e.args[0] == 'Discriminate Exception Here' and sse.some_property == some_special_value:
# handle the exception in a special way
else:
handle_exception_normally()
try:
# do stuff
except Exception as e:
if getattr(e, 'some_property', None) == some_special_value:
# handle the exception in a special way
else:
handle_exception_normally()
它更短,但要求 some_special_value 始终为 != None
并且属性对于您的异常是唯一的。
异常辨别示例,使用e.args[0]
:
try:
5 / 0
except Exception as e:
print(e.args[0])
division by zero
使用__class__.__name__
:
try:
5 / 0
except Exception as e:
print(e.__class__.__name__)
ZeroDivisionError
使用 isinstance()
(CPU 密集程度更高):
try:
5 / 0
except Exception as e:
isinstance(e, ZeroDivisionError)
True
关于python - 重新引发异常,以便在同一 block 中处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109971/