2011-10-10 18 views
28

Soy nuevo en Python. Solo quiero saber por qué se está ejecutando el bloque finally después de llamar al sys.exit(0) en el bloque except?¿Por qué finalmente el bloque se está ejecutando después de llamar a sys.exit (0) en el bloque except?

Código:.

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() 

Por cierto, sólo estaba tratando de hacer lo mismo que en Java, donde el bloque finally es no se ejecuta cuando es System.exit(0) en el bloque catch.

Respuesta

60

Todo sys.exit() hace es generar una excepción de tipo SystemExit.

Desde el documentation:

salida desde Python. Esto se implementa elevando la excepción SystemExit , por lo que se respetan las acciones de limpieza especificadas por finally cláusulas de try declaraciones, y es posible interceptar el intento de salida en un nivel externo.

Si ejecuta el siguiente, verá usted mismo:

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

Como alternativa, os._exit() detendrá el proceso de pasar la mayor parte de la limpieza, incluyendo finally bloques etc.

+0

+1 para su buena explicación @ Aix – Reuben

4

Acerca de su ejemplo:

Una cláusula finally siempre se ejecuta antes de abandonar la instrucción try, si ha ocurrido una excepción o no.

Esto es de Error and Exceptions parte de Python docs. Entonces, su bloque finally siempre se ejecutará en el ejemplo que muestre a menos que use os._exit(). Pero debe usarlo sabiamente ...

Cuestiones relacionadas