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.