Mic*_*per 2 python exception-handling python-3.x
我的代码有点像这样:
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()
Run Code Online (Sandbox Code Playgroud)
我想捕获特定的异常并以特殊方式处理它,但前提是它具有特定属性.如果它没有该属性,我希望它像任何其他异常一样处理(记录,尖叫等)
上面的代码有效,但如果可能的话,我想避免重复handle_exception_normally()(DRY和所有这些).
只是放入第一个块raise的else子句except不起作用.父try块会捕获它,但同一块中的catch-all子句不会.
我可以嵌套两个try街区,但它不是很优雅; 我宁愿只使用上面的代码.
有没有更好的办法?
请注意,我使用的是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()
Run Code Online (Sandbox Code Playgroud)
摩西·科莱多耶提出:
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()
Run Code Online (Sandbox Code Playgroud)
哪个更短但需要some_special_value始终!= None和属性对您的异常是唯一的.
例外歧视的例子,包括e.args[0]:
try:
5 / 0
except Exception as e:
print(e.args[0])
division by zero
Run Code Online (Sandbox Code Playgroud)
用__class__.__name__:
try:
5 / 0
except Exception as e:
print(e.__class__.__name__)
ZeroDivisionError
Run Code Online (Sandbox Code Playgroud)
随着isinstance()(位更多的CPU):
try:
5 / 0
except Exception as e:
isinstance(e, ZeroDivisionError)
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |