print - try catch python example
Python try finally block returns (4)
Esta pregunta ya tiene una respuesta aquí:
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 .