Python:从最终导致的最终执行?

lin*_*ndy -1 python exception

说我有以下代码:

try:
    [...]
except:
    raise Exception([...])
finally:
    [code]
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果try块中的代码引发了一个被捕获的异常except,那么是[code]从finally子句中引发新异常以来执行的except子句吗?如果是这样,什么时候执行?在引发新异常之前或通过方法堆栈传播新异常之前?

zmo*_*zmo 6

一个例子值得1000字,你为什么不试试你写的?

>>> def foo():
>>>     try:
>>>         print "2 try block"
>>>         raise Exception("1")
>>>         print "never printed"
>>>     except:
>>>         print "3 first except block"
>>>         raise Exception("2")
>>>     finally:
>>>         print "4 finally block"
>>>     print "end of function"
>>>
>>> try:
>>>     print "1 before foo"
>>>     foo()
>>>     print "never printed too"
>>> except:
>>>     print "5 outter except clause"
1 before foo
2 try block
3 first except block
4 finally block
5 outter except clause
Run Code Online (Sandbox Code Playgroud)

在引发新异常之前或通过方法堆栈传播新异常之前?

因此,从示例中可以看出,finally块是在已定义的except块之后调用的(即在离开try/ except/ finally块之后),但在到达外部try/ except块之前.

这是合乎逻辑的,您希望在退出try块时始终触发finally,但是在退出块时,您可以确保在执行try语句之外的代码(无论是释放资源还是重置)时代码环境是一致的值,或回滚/提交修改......).