2011-12-20 72 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