说我有以下代码:
try:
[...]
except:
raise Exception([...])
finally:
[code]
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果try块中的代码引发了一个被捕获的异常except,那么是[code]从finally子句中引发新异常以来执行的except子句吗?如果是这样,什么时候执行?在引发新异常之前或通过方法堆栈传播新异常之前?
一个例子值得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语句之外的代码(无论是释放资源还是重置)时代码环境是一致的值,或回滚/提交修改......).