说我有以下代码:
try:
[...]
except:
raise Exception([...])
finally:
[code]
我的问题是:如果try
块中的代码引发了except
中捕获的异常,那么自新异常以来执行的[code]
子句中的finally
是except
在{{1}}条款中提出?如果是这样,什么时候执行?在引发新异常之前还是在通过方法堆栈传播新异常之前?
答案 0 :(得分: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
在引发新异常之前还是在通过方法堆栈传播新异常之后?
从示例中可以看出,finally块是在已定义的except块之后调用的(即在离开try
/ except
/ finally
块之后) ,但在进入外部try
/ except
区块之前。
哪个是合乎逻辑的,你希望在退出try
块时始终触发finally,但是当你退出它时,你可以确保你的代码环境在执行{{1}之外的代码时是一致的语句(无论是释放资源,还是重置值,还是回滚/提交修改......)。
答案 1 :(得分:3)
最终执行,无论try块成功还是由于异常而运行except块!
即使你的except块引发异常,新的异常也会被另一个try catch处理程序处理,但是在执行finally块之后,而不是形成一个递归循环:
try:
try:
[...]
except:
raise Exception([...]) #this is line number xyz
finally:
[code]
except:
[...] #this code will be running after line number xyz