Levantamento Python de

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 frominstruçã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 exLinguagem 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 ZeroDivisionErrorexceção. Dentro do manipulador, levantamos uma nova ValueErrorexceçã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 zeroLinguagem 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 ZeroDivisionErrorexceção, a ValueErrorexceção ocorreu.

Para instruir o Python que você deseja modificar e encaminhar a ZeroDivisionErrorexceção, você pode usar a raise frominstruçã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 zeroLinguagem de código:  Python  ( python )

Agora você recebe a ValueErrorexceçã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 ValueErrorexceçã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 zeroLinguagem 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 Noneinstrução:

raise <ExceptionType> from NoneLinguagem de código:  Python  ( python )

Por exemplo, você pode ocultar a causa da ValueErrorexceçã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 zeroLinguagem de código:  Python  ( python )

Agora, o __cause__é None. Além disso, a divide()função gera a ValueErrorexceção sem qualquer informação adicional.

Se você remover a tryinstruçã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 zeroLinguagem de código:  Python  ( python )

Resumo

  • Use a instrução Python raise frompara modificar e encaminhar uma exceção existente.
  • Use a raise exception from Noneinstrução para ocultar a causa da exceção.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *