2011-12-20 8 views
13

Perché l'eccezione in foo sibila inosservata, ma viene sollevata l'eccezione in bar?python try-finally

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

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

foo() 
bar() 
+5

duplicato di [return eats exception] (http://stackoverflow.com/questions/517060/return-eats-exception) – gecco

risposta

19

Dal Python documentation:

Se la clausola finally solleva un'altra eccezione o esegue un'istruzione return o di rottura, l'eccezione salvato è perduto.

+1

interessante! dove va ', se questa domanda ha senso? – wim

+5

@wim: Va dove le variabili locali vanno alla fine della funzione, suppongo. Un modo per vederlo è che l'eccezione è controrilanciata alla fine del blocco 'finally'. Dal momento che il 'return' salta il resto del blocco' finally', non si verifica mai il ripristino dell'eccezione. – interjay