A diferença é que, quando você usa from
, o __cause__
atributo é definido e a mensagem informa que a exceção foi causada diretamente por . Se você omitir, from
então não __cause__
será definido, mas o __context__
atributo também poderá ser definido, e o rastreamento mostrará o contexto como durante o tratamento de algo que aconteceu .
Definir o que __context__
acontece se você usou raise
em um manipulador de exceções; se você usou em raise
qualquer outro lugar, também não __context__
está definido.
Se a __cause__
estiver definido, um __suppress_context__ = True
sinalizador também será definido na exceção; Quando __suppress_context__
está definido como True
, o __context__
é ignorado ao imprimir um retorno.
Ao passar de um manipulador de exceções no qual você não deseja mostrar o contexto (não deseje uma mensagem durante o tratamento de outra exceção ), use raise ... from None
para definir __suppress_context__
como True
.
Em outras palavras, o Python define um contexto para exceções, para que você possa examinar onde uma exceção foi gerada, permitindo ver se outra exceção foi substituída por ela. Você também pode adicionar uma causa a uma exceção, explicitando explicitamente o traceback sobre a outra exceção (use palavras diferentes) e o contexto é ignorado (mas ainda pode ser observado durante a depuração). Usar raise ... from None
permite suprimir o contexto que está sendo impresso.
Veja a raise
documentação documentada :
A from
cláusula é usada para o encadeamento de exceções: se fornecida, a segunda expressão deve ser outra classe ou instância de exceção, que será anexada à exceção gerada como o __cause__
atributo (que é gravável). Se a exceção levantada não for tratada, as duas exceções serão impressas:
>>> 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
Um mecanismo semelhante funciona implicitamente se uma exceção é gerada dentro de um manipulador ou finally
cláusula de exceção: a exceção anterior é anexada como o novo __context__
atributo da exceção :
>>> 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 também a documentação de exceções internas para obter detalhes sobre o contexto e causar informações anexadas a exceções.