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

Jac*_*ing 2 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
Run Code Online (Sandbox Code Playgroud)

我正在使用该标志,因为raise没有先前的异常调用会引发一个TypeError.没有旗帜,有更多的Pythonic方式吗?

Mar*_*ers 9

在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子句被执行,包括任何exceptelse条款.如果任何子句中发生异常但未处理,则会临时保存该异常.该finally条款已执行.如果存在已保存的异常,则在该finally子句的末尾重新引发.

请注意,如果finally套件使用breakor return语句,则会丢弃已保存的异常:

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

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

>>> f()
42
Run Code Online (Sandbox Code Playgroud)

但是如果你发布一个break,continue或者returntry套件中,finally套件仍然被执行:

当一个return,breakcontinue声明的执行try套件中的try... finally语句时,finally子句也"的出路."执行

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