Resumo : neste tutorial, você aprenderá como usar a instrução raise from do Python para gerar uma exceção com informações extras.
Introdução à instrução raise from do Python
A raise from
instrução tem a seguinte sintaxe:
raise <ExceptionType> from <cause>
Linguagem de código: Python ( python )
Tecnicamente, é equivalente ao seguinte:
ex = ExceptionType
ex.__cause__ = cause
raise ex
Linguagem de código: Python ( python )
Por padrão, o __cause__
atributo em objetos de exceção é sempre inicializado como None
.
Exemplo de aumento de declaração em Python
A seguinte divide()
função divide um número por outro e retorna o resultado da divisão:
def divide(a, b):
try:
return a / b
except ZeroDivisionError as ex:
raise ValueError('b must not be zero')
Linguagem de código: Python ( python )
A divide()
função possui um manipulador de exceção que captura a ZeroDivisionError
exceção. Dentro do manipulador, levantamos uma nova ValueError
exceção.
Se você passar zero para o segundo argumento da divide()
função:
def divide(a, b):
try:
return a / b
except ZeroDivisionError as ex:
raise ValueError('b must not be zero') from ex
divide(10, 0)
Linguagem de código: Python ( python )
você obterá o seguinte rastreamento de pilha:
Traceback (most recent call last):
File "c:/python/app.py", line 3, in divide
return a / b
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:/python/app.py", line 8, in <module>
divide(10, 0)
File "c:/python/app.py", line 5, in divide
raise ValueError('b must not be zero')
ValueError: b must not be zero
Linguagem de código: Python ( python )
A mensagem de importação é:
During handling of the above exception, another exception occurred:
Linguagem de código: Python ( python )
Isso significa que enquanto você estava tratando a ZeroDivisionError
exceção, a ValueError
exceção ocorreu.
Para instruir o Python que você deseja modificar e encaminhar a ZeroDivisionError
exceção, você pode usar a raise from
instrução como esta:
def divide(a, b):
try:
return a / b
except ZeroDivisionError as ex:
raise ValueError('b must not be zero') from ex
divide(10, 0)
Linguagem de código: Python ( python )
Ao executar o código, você obterá o seguinte rastreamento de pilha:
Traceback (most recent call last):
File "c:/python/app.py", line 3, in divide
return a / b
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "c:/python/app.py", line 8, in <module>
divide(10, 0)
File "c:/python/app.py", line 5, in divide
raise ValueError('b must not be zero') from ex
ValueError: b must not be zero
Linguagem de código: Python ( python )
Agora você recebe a ValueError
exceção com uma causa adicionada ao atributo __cause__ do objeto de exceção.
O seguinte modifica o código acima para mostrar o __cause__
atributo da ValueError
exceção:
def divide(a, b):
try:
return a / b
except ZeroDivisionError as ex:
raise ValueError('b must not be zero') from ex
try:
divide(10, 0)
except ValueError as ex:
print('cause:', ex.__cause__)
print('exception:', ex)
Linguagem de código: Python ( python )
Saída:
cause: division by zero
exception: b must not be zero
Linguagem de código: Python ( python )
Python levanta exceção de None
Se a causa da exceção não for importante, você poderá omitir a causa usando a raise exception from None
instrução:
raise <ExceptionType> from None
Linguagem de código: Python ( python )
Por exemplo, você pode ocultar a causa da ValueError
exceção na divide()
função da seguinte maneira:
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
raise ValueError('b must not be zero') from None
try:
divide(10, 0)
except ValueError as ex:
print('cause:', ex.__cause__)
print('exception:', ex)
Linguagem de código: Python ( python )
Saída:
cause: None
exception: b must not be zero
Linguagem de código: Python ( python )
Agora, o __cause__
é None
. Além disso, a divide()
função gera a ValueError
exceção sem qualquer informação adicional.
Se você remover a try
instrução no código que chama a divide()
função:
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
raise ValueError('b must not be zero') from None
divide(10, 0)
Linguagem de código: Python ( python )
você obterá o seguinte rastreamento de pilha:
Traceback (most recent call last):
File "c:/python/app.py", line 8, in <module>
divide(10, 0)
File "c:/python/app.py", line 5, in divide
raise ValueError('b must not be zero') from None
ValueError: b must not be zero
Linguagem de código: Python ( python )
Resumo
- Use a instrução Python
raise from
para modificar e encaminhar uma exceção existente. - Use a
raise exception from None
instrução para ocultar a causa da exceção.