volviendo a lanzar la excepción de Python.¿Cuál atrapar?
Pregunta
Estoy aprendiendo a usar Python.Acabo de encontrar este artículo:http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.htmlDescribe cómo volver a lanzar excepciones en Python, así:
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
Dado que vuelve a lanzar la excepción, debería haber una declaración de "captura externa excepto".Pero ahora estaba pensando.¿Qué pasa si do_something_to_apologize() dentro de excepto arroja un error?¿Cuál quedará atrapado en el "captura de excepción" exterior?¿El que vuelves a lanzar o el que arroja do_something_to_apologize() ?¿O se detectará primero la excepción con mayor prioridad?
Solución
Pruébelo y vea:
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 el except
. apologize
genera un nuevo error antes de raise
es alcanzado.Por lo tanto, la raise
en el except
La cláusula 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 iba a generar una excepción diferente después apologize
.
Tenga en cuenta que en Python 3, el rastreo mencionará ambos excepciones, con un mensaje explicando 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 afuera y puede ser detectada por un nivel superior. except
cláusula.La excepción original se menciona en el rastreo, pero se incluye en el posterior y ya no se puede detectar.
Otros consejos
La excepción lanzada por do_something_to_apologizar () será atrapado.La línea que contiene aumento nunca funcionará, debido a la excepción lanzada por do_something_to_apologizar.Además, no creo que haya una idea de "prioridad" en excepciones de Python.