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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top