validar utilizar try tipos recent por most last imprimir excepciones error ejemplos diferentes como catch python exception throw rethrow

utilizar - reedición de la excepción de Python. ¿Cuál atrapar?



traceback(most recent call last) python (2)

Estoy aprendiendo a usar python. Acabo de encontrar este artículo: http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html Describe las excepciones de reenvío en python, como esto:

try: do_something_dangerous() except: do_something_to_apologize() raise

Desde que vuelves a lanzar la excepción, debe haber una declaración "catch-except externo". Pero ahora, estaba pensando. ¿Qué pasa si do_something_to_apologize () dentro de la excepción produce un error. ¿Cuál será atrapado en el "catch-except" exterior? ¿La que vuelves a hacer o la que lanzaste do_something_to_apologize ()? ¿O será capturada primero la excepción con la más alta priotiría?


La excepción lanzada por do_something_to_apologize () será capturada. La línea que contiene el aumento nunca se ejecutará, debido a la excepción lanzada por do_something_to_apologize. Además, no creo que haya ninguna idea de "prioridad" en las excepciones de python.


Pruébalo y mira:

def failure(): raise ValueError, "Real error" def apologize(): raise TypeError, "Apology error" try: failure() except ValueError: apologize() raise

El resultado:

Traceback (most recent call last): File "<pyshell#14>", line 10, in <module> apologize() File "<pyshell#14>", line 5, in apologize raise TypeError, "Apology error" TypeError: Apology error

La razón: el error "real" de la función original ya fue detectado por la except . apologize genera un nuevo error antes de que se alcance el raise . Por lo tanto, el raise en la cláusula de except nunca se ejecuta, y solo el error de la disculpa se propaga hacia arriba. Si apologize genera un error, Python no tiene forma de saber que ibas a plantear una excepción diferente después de apologize .

Tenga en cuenta que en Python 3, el rastreo mencionará ambas excepciones, con un mensaje que explica cómo surgió la segunda:

Traceback (most recent call last): File "./prog.py", line 9, in <module> File "./prog.py", line 2, in failure ValueError: Real error During handling of the above exception, another exception occurred: Traceback (most recent call last): File "./prog.py", line 11, in <module> File "./prog.py", line 5, in apologize TypeError: Apology error

Sin embargo, la segunda excepción (la excepción de "disculpa") sigue siendo la única que se propaga hacia el exterior y puede ser captada por una cláusula de except nivel superior. La excepción original se menciona en el rastreo, pero se subsume en la última y ya no se puede capturar.