仅在发生异常时才重新引发异常的更好语法?

时间:2013-03-25 20:19:17

标签: python exception

当我想捕获异常时,我发现自己这样做,总是运行一些特定代码,然后重新引发原始异常:

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方法吗?

2 个答案:

答案 0 :(得分:9)

在except处理程序中引发异常:

try:
    # do something that *might* raise an exception
except Exception:
    raise
finally:
    # something I *always* want to run

finally套件总是将被执行或者不再重新提出异常。

来自documentation

  

如果存在finally,则指定'清理'处理程序。执行try子句,包括任何exceptelse子句。如果任何子句中发生异常但未处理,则会临时保存该异常。执行finally子句。如果存在已保存的异常,则会在finally子句的末尾重新引发该异常。

请注意,如果finally套件使用breakreturn语句,则保存的异常 将被丢弃:

  

如果finally子句执行return或break语句,则丢弃保存的异常:

def f():
    try:
        1/0
    finally:
        return 42

>>> f()
42

但如果您在break套件中发出continuereturntryfinally套件仍会执行:

  

return ... break声明的continue套件中执行trytryfinally声明后, finally子句也在出路时执行。

请注意,在Python 2.5之前,您甚至无法在同一except语句中组合finallytry套件;见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)

无论finallytry块中发生什么,或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