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

print - try except python 3



Comportamiento extraño de Try-Except-Else-Finally con declaraciones de devolución (2)

Esta pregunta ya tiene una respuesta aquí:

Este es un código que se está comportando de manera peculiar. Esta es una versión simplificada del comportamiento que he escrito. Esto aún demostrará el comportamiento extraño y tuve algunas preguntas específicas sobre por qué ocurre esto.

Estoy usando Python 2.6.6 en Windows 7.

def demo1(): try: raise RuntimeError,"To Force Issue" except: return 1 else: return 2 finally: return 3 def demo2(): try: try: raise RuntimeError,"To Force Issue" except: return 1 else: return 2 finally: return 3 except: print 4 else: print 5 finally: print 6 if __name__ == "__main__": print "*** DEMO ONE ***" print demo1() print "****************" print print "*** DEMO TWO ***" print demo2() print "****************"

Cuando ejecuta este script, se imprimirá:

*** DEMO ONE *** 3 **************** *** DEMO TWO *** 6 3 ****************

¿Por qué la demo uno devuelve 3 en lugar de 1? ¿Por qué la demo dos imprime 6 en lugar de imprimir 6 w / 4 o 5?

Gracias por tu ayuda.


El orden de ejecución es:

  1. try block all complete normalmente -> finally block -> ends finaliza
  2. prueba ejecutar bloque y entrar en la excepción A -> finalmente bloquear -> finaliza la función
  3. try block make a return value y call return -> finally block -> popup return value -> function ends

Entonces, cualquier devolución en el bloque final terminará los pasos por adelantado.


Porque finally se garantiza que se ejecutarán los enunciados (bueno, suponiendo que no hay corte de energía ni nada fuera del control de Python). Esto significa que antes de que la función pueda regresar, debe ejecutar el bloque finally, que devuelve un valor diferente.

El estado de los documentos Python :

Cuando se ejecuta una sentencia return, break o continue en el try suite de una declaración try ... finally, la cláusula finally también se ejecuta ''en el camino de salida''. Una declaración de continuación es ilegal en la cláusula finally. (La razón es un problema con la implementación actual; esta restricción puede ser levantada en el futuro).

Esto significa que cuando intenta regresar, se llama al bloque finally , devolviendo su valor, en lugar del que tendría.