当我想捕获异常时,我发现自己这样做,总是运行一些特定的代码,然后重新引发原始异常:
try:
error = False
# do something that *might* raise an exception
except Exception:
error = True
finally:
# something I *always* want to run
if error:
raise
Run Code Online (Sandbox Code Playgroud)
我正在使用该标志,因为raise没有先前的异常调用会引发一个TypeError.没有旗帜,有更多的Pythonic方式吗?
在except处理程序中引发异常:
try:
# do something that *might* raise an exception
except Exception:
raise
finally:
# something I *always* want to run
Run Code Online (Sandbox Code Playgroud)
该finally套件总是会被执行用是否您重新抛出的异常.
从文档:
如果
finally存在,则指定'清理'处理程序.该try子句被执行,包括任何except和else条款.如果任何子句中发生异常但未处理,则会临时保存该异常.该finally条款已执行.如果存在已保存的异常,则在该finally子句的末尾重新引发.
请注意,如果finally套件使用breakor return语句,则会丢弃已保存的异常:
如果
finally子句执行return或break语句,则丢弃保存的异常:Run Code Online (Sandbox Code Playgroud)def f(): try: 1/0 finally: return 42 >>> f() 42
但是如果你发布一个break,continue或者return在try套件中,finally套件仍然被执行:
当一个
return,break或continue声明的执行try套件中的try...finally语句时,finally子句也"的出路."执行
请注意,在Python 2.5之前,您甚至无法在同一语句中组合except和finally套件try; 参见PEP 341:统一尝试/除/最终.相反,你应该嵌套try语句:
try:
try:
# some code that could raise an exception
except SomeException:
# exception handler
finally:
# cleanup code, always executed
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |