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, fromentonces 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ó raiseen un controlador de excepciones; si lo usó en raisecualquier otro lugar, tampoco __context__está configurado.
Si __cause__se establece a, __suppress_context__ = Truetambié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 Noneal 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 Nonepermite suprimir el contexto que se imprime.
Vea la raisedocumentación de la declaración :
La fromclá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 finallyclá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.