2011-12-20 10 views
13

Dlaczego wyjątek w foo przechodzi przez niezauważony, ale wyjątek w bar został zgłoszony?Python próbny w końcu

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

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

foo() 
bar() 
+5

duplikat [powrót zjada wyjątek] (http://stackoverflow.com/questions/517060/return-eats-exception) – gecco

Odpowiedz

19

Z Python documentation:

Jeżeli wreszcie klauzula podnosi inny wyjątek lub wykonuje powrotny lub złamać oświadczenie, zapisany Wyjątkiem jest stracone.

+1

interesujące! gdzie to "pójdzie", jeśli to pytanie ma sens? – wim

+5

@wim: Działa wszędzie tam, gdzie występują zmienne lokalne na końcu funkcji, jak przypuszczam. Jednym ze sposobów obejrzenia tego jest to, że wyjątek jest ponownie podnoszony na końcu bloku 'finally'. Ponieważ 'return' przeskakuje resztę' finally' bloku, ponowne podniesienie wyjątku nigdy się nie dzieje. – interjay

Powiązane problemy