La diferencia es que cuando usa from
, el __cause__
atributo se establece y el mensaje indica que la excepción fue causada directamente por . Si omite, from
entonces no __cause__
se establece, pero el __context__
atributo también se puede establecer, y el rastreo luego muestra el contexto como durante el manejo de que sucedió algo más .
Establecer lo que __context__
sucede si lo usó raise
en un controlador de excepciones; si lo usó en raise
cualquier otro lugar, tampoco __context__
está configurado.
Si __cause__
se establece a, __suppress_context__ = True
también se establece un indicador en la excepción; cuando __suppress_context__
se establece en True
, __context__
se ignora al imprimir un rastreo.
Cuando se plantea desde un manejador de excepción en el que no desea mostrar el contexto (no quiero una durante la manipulación otra excepción ocurrió mensaje), a continuación, utilizar raise ... from None
al conjunto __suppress_context__
a True
.
En otras palabras, Python establece un contexto de excepciones para que pueda introspectar dónde se generó una excepción, permitiéndole ver si otra excepción fue reemplazada por ella. También puede agregar una causa a una excepción, haciendo que el rastreo sea explícito sobre la otra excepción (use una redacción diferente), y el contexto se ignora (pero aún puede ser introspectado al depurar). El uso le raise ... from None
permite suprimir el contexto que se imprime.
Vea la raise
documentación de la declaración :
La from
cláusula se usa para el encadenamiento de excepciones: si se proporciona, la segunda expresión debe ser otra clase o instancia de excepción, que luego se adjuntará a la excepción generada como el __cause__
atributo (que se puede escribir). Si no se maneja la excepción planteada, se imprimirán ambas excepciones:
>>> try:
... print(1 / 0)
... except Exception as exc:
... raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
Un mecanismo similar funciona implícitamente si se genera una excepción dentro de un controlador de excepciones o una finally
cláusula: la excepción anterior se adjunta como el __context__
atributo de la nueva excepción :
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
Consulte también la documentación de Excepciones incorporadas para obtener detalles sobre el contexto y la información de causa adjunta a las excepciones.