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

时间:2013-06-19 12:14:28

标签: python exception

说我有以下代码:

try:
    [...]
except:
    raise Exception([...])
finally:
    [code]

我的问题是:如果try块中的代码引发了except中捕获的异常,那么自新异常以来执行的[code]子句中的finallyexcept在{{1}}条款中提出?如果是这样,什么时候执行?在引发新异常之前还是在通过方法堆栈传播新异常之前?

2 个答案:

答案 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