Crie exceções personalizadas em Python

Rayven Esplanada 10 outubro 2023
  1. Crie uma classe de exceção personalizada em Python
  2. Execute o tratamento de exceções usando o bloco try...except em Python
Crie exceções personalizadas em Python

Este tutorial demonstrará que você pode criar classes de exceção personalizadas em Python. Aqui, mostraremos como você pode executar adequadamente o tratamento de exceções, definir classes de exceção personalizadas e substituir as exceções integradas existentes.

Exceções são um tipo de evento que ocorre sempre que algo dentro de um programa não sai como pretendido ou interrompe o fluxo do caso de uso pretendido do programa. Sem o tratamento de exceções, o programa deixará de ser executado totalmente e a exceção deverá ser corrigida ou tratada.

Crie uma classe de exceção personalizada em Python

A criação de uma classe de exceção em Python é feita da mesma maneira que uma classe normal. A principal diferença é que você tem que incluir a classe base do Python Exception para informar ao compilador que a classe que você está criando é uma classe de exceção.

Vamos testar esse método para criar uma classe de exceção chamada DemoException e usar a palavra-chave de fluxo de controle de espaço reservado pass para dentro como um espaço reservado.

class DemoException(Exception):
    pass

Execute Exception-Raising usando a palavra-chave raise em Python

Para testar a classe DemoException e ver o que ela exibe quando é realmente disparada, execute o levantamento da exceção. O lançamento de exceções é sinônimo de lançamento de exceções em outras linguagens de programação.

Usando a palavra-chave raise, acione uma exceção usando a classe de exceção fornecida e produza uma mensagem de exceção.

class DemoException(Exception):
    pass


raise DemoException

Resultado:

Traceback (most recent call last):
  File "/Users/demo/python/demo_exception.py", line 4, in <module>
    raise DemoException
__main__.DemoException

Uma exceção padrão aparecerá no terminal se nenhuma mensagem de exceção personalizada tiver sido declarada.

Declare uma mensagem de exceção personalizada em Python

Para declarar uma mensagem de exceção personalizada para DemoException, substitua o método __init__() da classe de exceção e inclua a mensagem que deve ser emitida para a exceção nos parâmetros, junto com o parâmetro auto-referencial obrigatório self.

Por exemplo, vamos substituir o método __init__() e criar uma mensagem personalizada para a classe DemoException:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)

Observe que, para que a mensagem seja integrada à sua exceção com sucesso, chame a classe base Exception, método __init__() e inclua a message como um argumento.

Vamos chamar a classe de exceção novamente usando a palavra-chave raise e agora, passando uma mensagem personalizada com ela:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


message = "Exception Triggered! Something went wrong."
raise DemoException(message)

A saída deve ser semelhante a esta:

Traceback (most recent call last):
  File "/Users/demo/python/helloworld.py", line 6, in <module>
    raise DemoException(message)
__main__.DemoException: Exception Triggered! Something went wrong.

Agora, criamos e acionamos com sucesso uma classe de exceção com uma mensagem de erro personalizada.

Para situações reais que podem disparar uma exceção, como tratamos e levantamos essas exceções? Você pode resolver este problema perfeitamente implementando o tratamento de exceções usando o bloco try...except.

Execute o tratamento de exceções usando o bloco try...except em Python

O bloco try...except é muito parecido com o bloco try-catch em outras linguagens como Java.

O bloco try...except tem 2 blocos principais e 2 blocos opcionais:

  • try (obrigatório) - O bloco principal responsável por encapsular o bloco de código onde a exceção pode ser disparada. O bloco try interrompe todo o processo dentro dele sempre que uma exceção é acionada.
  • except (obrigatório) - O programa de bloco continua sempre que uma exceção especificada é acionada. Este bloco normalmente contém uma mensagem de erro descritiva para o chamador ou apenas uma simples instrução print(). Pode haver mais de um bloco except em um único bloco try, cada um capturando diferentes exceções.
  • else (opcional) - Este bloco opcional é onde o programa prosseguirá se o bloco try não disparou nenhuma exceção.
  • finally (opcional) - Este bloco opcional é executado uma vez que tudo dos 3 blocos anteriores foi executado, independentemente se uma exceção é acionada ou não.

Vamos usar o exemplo anterior usando a classe DemoException para tentar um bloco try...except simples.

Primeiro, envolva a palavra-chave raise em uma função e coloque-a dentro do bloco try...except.

A função que criaremos para este exemplo é uma função que aceita um número e lança uma exceção se enviar 0. Se enviar qualquer outro número, o código continuará conforme o planejado. Veja o exemplo abaixo:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


message = "Exception Triggered! Something went wrong."


def triggerException(num):
    if num == 0:
        raise DemoException(message)
    else:
        print(num)


try:
    triggerException(0)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

Visto que triggerException() passou 0 como um argumento, o código deve acionar DemoException. Aqui, devemos esperar que a mensagem de palavra-chave raise seja substituída por tudo o que está dentro do bloco except como saída.

Observe que a linha print() após a chamada da função triggerException() não foi emitida. É porque a função gerou uma exceção; portanto, ele imediatamente interrompeu todos os processos dentro do bloco try e prosseguiu diretamente para o bloco except.

Resultado:

Error: Number should not be 0.

Agora, vamos tentar passar um número válido como 20, por exemplo.

try:
    triggerException(20)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

Resultado:

20
Code has successfully been executed.

Vamos tentar encadear os blocos except e criar outra exceção. Vamos chamar a nova exceção de NumberFormatException, que dispara se a entrada fornecida não for um número. Para esta classe de exceção, vamos declarar a mensagem dentro da classe.

class NumberFormatException(Exception, value):
    message = f"{value} is not a number"

    def __init__(self):
        super().__init__(message)

Agora, modifique o código acima para lidar com a nova classe de exceção NumberFormatException:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)


class NumberFormatException(Exception):
    def __init__(self, message, value):
        message = f"{value} is not a number"
        super().__init__(message)


message = "Exception occured."


def triggerException(num):
    if not num.isdigit():
        raise NumberFormatException(message, num)
    elif num == 0:
        raise DemoException(message)
    else:
        print(num)


num = "sample string"
try:
    triggerException(num)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")
except NumberFormatException:
    print(num + " is not a number.")

Neste código, o valor de num que foi passado para triggerException() é uma string 'sample string', portanto, NumberFormatException deve ser acionada.

Resultado:

sample string is not a number.

Em resumo, criar exceções personalizadas em Python é tão simples quanto criar uma nova classe, mas com a classe Exception como um argumento extra na definição de classe. A palavra-chave raise é usada para disparar exceções dada a Classe de Exceção. Os blocos try...except são usados para envolver uma ou mais exceções dentro de um bloco de código e modificar o que o código faz ao lidar com essa exceção e não apenas encerrar o programa completamente.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Artigo relacionado - Python Exception