try print pass exceptions example error custom catch all python order try-catch try-finally try-except

print - try catch python example



Python try finally block returns (4)

Ahí está el código interesante a continuación:

def func1(): try: return 1 finally: return 2 def func2(): try: raise ValueError() except: return 1 finally: return 3 func1() func2()

Podría agradar a alguien explicar, qué resultados devolverá estas dos funciones y explicar POR QUÉ, es decir, describir el orden de la ejecución


De la documentation Python

Una cláusula finally siempre se ejecuta antes de abandonar la instrucción try, ya sea que se haya producido o no una excepción. Cuando se ha producido una excepción en la cláusula try y no ha sido manejada por una cláusula except (o ha ocurrido en una cláusula except o else), se vuelve a generar después de que se haya ejecutado la cláusula finally. La cláusula finally también se ejecuta "en el camino de salida" cuando cualquier otra cláusula de la instrucción try se deja a través de una sentencia break, continue o return . Un ejemplo más complicado (tener cláusulas except y finally en la misma instrucción try funciona a partir de Python 2.5):

Entonces, una vez que el bloque try / except se deja usando return , que establecería el valor de retorno dado, finalmente los bloques se ejecutarán siempre , y deberían usarse para liberar recursos, etc. mientras se usa otra devolución, sobrescribe el original.

En su caso particular, func1() devuelve 2 y func2() devuelve 3 , ya que estos son valores devueltos en los bloques finally.


Poner print declaraciones de print antemano realmente, realmente ayuda:

def func1(): try: print ''try statement in func1. after this return 1'' return 1 finally: print ''after the try statement in func1, return 2'' return 2 def func2(): try: print ''raise a value error'' raise ValueError() except: print ''an error has been raised! return 1!'' return 1 finally: print ''okay after all that let/'s return 3'' return 3 print func1() print func2()

Esto devuelve:

try statement in func1. after this return 1 after the try statement in func1, return 2 2 raise a value error an error has been raised! return 1! okay after all that let''s return 3 3

Notará que python siempre devuelve lo último que se devolverá, independientemente de que el código "alcanzado" return 1 en ambas funciones.

Un bloque finally siempre se ejecuta, por lo que lo último que se devuelve en la función es lo que se devuelve en el bloque finally. En func1 , eso es 2. En func2 , eso es 3.


Siempre irá al bloque finally, por lo que ignorará los retornos en el try en excepto. Si tuviera una devolución por encima del intento y excepto, devolvería ese valor.

def func1(): try: return 1 # ignoring the return finally: return 2 # returns this return def func2(): try: raise ValueError() except: # is going to this exception block, but ignores the return because it needs to go to the finally return 1 finally: return 3 def func3(): return 0 # finds a return here, before the try except and finally block, so it will use this return try: raise ValueError() except: return 1 finally: return 3 func1() # returns 2 func2() # returns 3 func3() # returns 0


func1() devuelve 2. func2() devuelve 3.

finally bloque se ejecuta finalmente independientemente o excepción.

Puede ver el orden de ejecución usando depurador. Por ejemplo, mira un screencast .