当我想捕获异常时,我发现自己这样做,总是运行一些特定代码,然后重新引发原始异常:
try:
error = False
# do something that *might* raise an exception
except Exception:
error = True
finally:
# something I *always* want to run
if error:
raise
我正在使用该标志,因为在没有先前异常的情况下调用raise
会引发TypeError
。如果没有国旗,还有更多的Pythonic方法吗?
答案 0 :(得分:9)
在except处理程序中引发异常:
try:
# do something that *might* raise an exception
except Exception:
raise
finally:
# something I *always* want to run
finally
套件总是将被执行或者不再重新提出异常。
如果存在
finally
,则指定'清理'处理程序。执行try
子句,包括任何except
和else
子句。如果任何子句中发生异常但未处理,则会临时保存该异常。执行finally
子句。如果存在已保存的异常,则会在finally
子句的末尾重新引发该异常。
请注意,如果finally
套件使用break
或return
语句,则保存的异常 将被丢弃:
如果
finally
子句执行return或break语句,则丢弃保存的异常: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: Unified try/except/finally。相反,您应该嵌套try
语句:
try:
try:
# some code that could raise an exception
except SomeException:
# exception handler
finally:
# cleanup code, always executed
答案 1 :(得分:2)
finally
或try
块中发生什么,或except
块是否存在, except
总是执行
这两种方法都有效:
try:
# do something that *might* raise an exception
finally:
# something I *always* want to run
try:
# do something that *might* raise an exception
except Exception:
raise
finally:
# something I *always* want to run