2011-12-20 36 views
13

为什么foo这个异常不被注意到,但bar的异常被引发?python try-finally

def foo(): 
    try: 
     raise Exception('foo') 
    finally: 
     return 

def bar(): 
    try: 
     raise Exception('bar') 
    finally: 
     pass 

foo() 
bar() 
+5

重复的[return eats exception](http://stackoverflow.com/questions/517060/return-eats-exception) – gecco 2011-12-20 12:04:51

回答

19

Python documentation

如果最后条款引发了另一个异常或执行了return或break语句,保存异常丢失。

+1

有趣!如果这个问题甚至有意义,它在哪里“去”? – wim 2011-12-20 12:33:30

+5

@wim:我猜想,它会在函数末尾的任何位置出现局部变量。一种看待它的方式是在'finally'块的末尾重新提出异常。由于'return'跳过了'finally'块的其余部分,所以再次提升异常不会发生。 – interjay 2011-12-20 12:46:10