Maneira Correta de Declarar Exceções Personalizadas no Python Moderno

Ana Maria Gomes
5 minutos de leitura

Conteúdos do tutorial

Quando você está trabalhando em um projeto Python, pode se deparar com situações em que as exceções integradas não capturam exatamente os erros específicos com os quais você está lidando. Nesses casos, criar exceções personalizadas pode ser incrivelmente útil. Mas qual é a maneira correta de declarar exceções personalizadas no Python moderno? Vamos explorar as melhores práticas para definir suas próprias classes de exceção.

Criando Exceções Personalizadas Básicas

A forma mais simples de uma exceção personalizada é apenas uma classe que herda da classe Exception integrada do Python. Veja como você pode criar uma:

class MinhaExcecao(Exception):
    """Levantada para o meu tipo específico de exceção"""

Esta é a forma mais básica de uma exceção personalizada. É uma boa prática incluir um docstring para explicar quando essa exceção deve ser levantada.

Adicionando Informações Adicionais às Exceções

Às vezes, você pode querer incluir mais informações sobre o erro. Você pode fazer isso sobrescrevendo o método __init__ da sua classe de exceção personalizada. Aqui está um exemplo:

class ErroDeValidacao(Exception):
    def __init__(self, mensagem, erros):
        super().__init__(mensagem)
        self.erros = erros

Neste exemplo, ErroDeValidacao recebe um parâmetro adicional erros, que poderia ser um dicionário de mensagens de erro. Isso permite que você passe e acesse informações adicionais sobre o erro.

Evitando Recursos Obsoletos

Em versões mais antigas do Python, as exceções tinham um atributo message que foi descontinuado. Para evitar avisos, você não deve usar esse atributo diretamente. Em vez disso, passe sua mensagem para o construtor da classe base, como mostrado no exemplo de ErroDeValidacao acima.

Acessando Detalhes da Exceção

Quando você levanta uma exceção, pode passar uma mensagem ou até mesmo um dicionário como argumento. Veja como você pode levantar e capturar uma exceção desse tipo:

try:
    raise MinhaExcecao("Meu aerodeslizador está cheio de enguias")
except MinhaExcecao as e:
    print(e)

Se você passou um dicionário, você poderia acessá-lo assim:

try:
    raise MinhaExcecao({"mensagem": "Meu aerodeslizador está cheio de animais", "animal": "enguias"})
except MinhaExcecao as e:
    detalhes = e.args[0]
    print(detalhes["animal"])

Subclassificando Exceções Específicas

Se a sua exceção personalizada é um tipo específico de uma exceção existente, você deve subclassificar essa exceção específica em vez da genérica Exception. Isso fornece mais contexto e pode tornar o tratamento de erros mais preciso.

class MyAppValueError(ValueError):
    """Levantada quando um subconjunto específico de valores no contexto do aplicativo está errado"""
    def __init__(self, mensagem, foo, *args):
        self.mensagem = mensagem
        self.foo = foo
        super().__init__(mensagem, foo, *args)

Resumo

No Python moderno, declarar exceções personalizadas é direto. Comece subclassificando a classe Exception integrada ou uma exceção mais específica, se aplicável. Forneça um docstring para explicar o propósito da sua exceção personalizada. Sobrescreva o método __init__ se você precisar passar informações adicionais, mas evite usar recursos obsoletos como o atributo message. Seguindo essas diretrizes, você criará exceções personalizadas que são claras, informativas e fáceis de usar em seus projetos Python.

Inscreva-se gratuitamente e fique atualizado

Receba toda semana um resumo dos principais conteúdos da Asimov direto no seu e-mail. 100% livre de spam.

Áreas de interesse: