2011-10-10 14 views
28

Sono nuovo di Python. Voglio solo sapere perché il blocco finally è in esecuzione dopo aver chiamato sys.exit(0) nel blocco except?Perché finalmente il blocco si sta eseguendo dopo aver chiamato sys.exit (0) in eccetto il blocco?

Codice:.

import sys 

def sumbyzero(): 
    try: 
     10/0 
     print "It will never print" 
    except Exception: 
     sys.exit(0) 
     print "Printing after exit" 
    finally: 
     print "Finally will always print" 

sumbyzero() 

Btw, stavo solo cercando di fare la stessa cosa come in Java, in cui il blocco è finallynon eseguito quando System.exit(0) è nel blocco catch.

risposta

60

Tutto il sys.exit() fa sorgere un'eccezione di tipo SystemExit.

Dal documentation:

Esci da Python. Questo viene implementato sollevando l'eccezione SystemExit , azioni in modo di pulizia specificate dal finally clausole del try dichiarazioni sono onorati, ed è possibile intercettare il tentativo di uscire a livello esterno.

Se si esegue il seguente, vedrete voi stessi:

import sys 
try: 
    sys.exit(0) 
except SystemExit as ex: 
    print 'caught SystemExit:', ex 

In alternativa, os._exit() si fermerà il processo bypassando gran parte della pulizia, tra cui finally blocchi ecc

+0

+1 per la tua bella spiegazione @ Aix – Reuben

4

Informazioni sul tuo esempio:

Una clausola finally viene sempre eseguita prima di uscire dall'istruzione try, se si è verificata un'eccezione o meno.

Questo è da Error and Exceptions parte di documenti Python. Quindi - il tuo blocco finale verrà sempre eseguito nell'esempio che mostri, a meno che non usi il os._exit(). Ma dovresti usarlo saggiamente ...

Problemi correlati