2

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

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 的方式?

4

2 回答 2

9

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

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

无论您是否重新引发异常,套件总是会被finally执行

文档中:

如果finally存在,它指定一个“清理”处理程序。该try子句被执行,包括任何exceptelse子句。如果任一子句发生异常且未处理,则暂时保存该异常。finally子句被执行。finally如果存在已保存的异常,则会在子句末尾重新引发。

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

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

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

>>> f()
42

但如果您发出break,continuereturntry套件中,finally套件仍会执行:

return, breakorcontinue语句在...语句try套件中执行时,该子句也将在“退出时”执行。</p> tryfinallyfinally

请注意,在 Python 2.5 之前,您甚至不能在同一语句中组合except和套件;参见PEP 341:统一 try/except/finally。相反,您应该嵌套语句:finallytrytry

try:
    try:
        # some code that could raise an exception
    except SomeException:
        # exception handler
finally:
    # cleanup code, always executed
于 2013-03-25T20:21:00.743 回答
2

finally始终执行,无论 or 块中发生什么tryexcept或者该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
于 2013-03-25T20:21:03.030 回答