logo

Exceções definidas pelo usuário em Python com exemplos

Exceções definidas pelo usuário são criadas definindo uma nova classe que herda de Exceção integrada do Python classe ou uma de suas subclasses. Ao fazer isso, podemos criar mensagens de erro personalizadas e lidar com erros específicos de uma forma que faça sentido para nosso aplicativo.

Etapas para criar e usar exceções definidas pelo usuário

Siga estas etapas para criar e usar exceções definidas pelo usuário em Python:



  • Defina uma nova classe de exceção: Crie uma nova classe que herda de Exception ou de qualquer uma de suas subclasses.
  • Levante a exceção: Use a instrução raise para gerar a exceção definida pelo usuário quando ocorrer uma condição específica.
  • Lidar com a exceção: Use blocos try-except para lidar com a exceção definida pelo usuário.

Exemplo: Neste exemplo, criamos uma exceção personalizada InvalidAgeError para garantir que os valores de idade estejam dentro de um intervalo válido (0–120).

Python
# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120'): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f'Age set to: {age}') # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e) 

Saída
150 -> Age must be between 0 and 120 

Explicação:

  • A classe InvalidAgeError herda de Exception. Ele define um __quente__ método para aceitar idade e mensagem.
  • O método __str__ retorna uma representação de string legível do erro.
  • Em set_age() se a idade estiver fora do intervalo válido (0–120), a exceção será levantada.
  • O bloco try-except captura a exceção e imprime a mensagem de erro.

Personalizando classes de exceção

Quando criamos uma exceção personalizada, criamos uma subclasse da classe Exception integrada do Python (ou uma subclasse como ValueError TypeError etc.). Podemos então adicionar nossos próprios métodos de atributos ou lógica personalizada para tornar nossa exceção mais informativa.



Também podemos aprimorar exceções personalizadas adicionando atributos extras ou substituindo métodos.

como ler um arquivo json

Exemplo: Aqui melhoramos o InvalidAgeError adicionando um código de erro e personalizando a mensagem de erro.

Python
class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120' error_code=1001): self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) def __str__(self): return f'[Error Code {self.error_code}] {self.age} -> {self.msg}' try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e) 

Saída
[Error Code 1001] 150 -> Age must be between 0 and 120 

Explicação:



  • InvalidAgeError agora possui um atributo adicional error_code.
  • O método __str__ é substituído para exibir o código de erro e a idade.
  • Quando set_age(150) é executado, a exceção é levantada e capturada no bloco try-except.
  • A mensagem de erro personalizada é impressa tornando o erro mais descritivo.

Usando exceções padrão como classe base

Às vezes, em vez de herdar diretamente de Exception, podemos criar uma exceção personalizada subclassificando uma exceção padrão, como RuntimeError ValueError etc. Isso é útil quando sua exceção personalizada deve ser tratada como um tipo específico de erro.

Exemplo: Este exemplo mostra como criar uma exceção personalizada NetworkError herdando de RuntimeError, que é uma exceção integrada padrão.

Python
# NetworkError has base RuntimeError and not Exception class NetworkError(RuntimeError): def __init__(self arg): self.args = (arg) # store as tuple try: raise NetworkError('Connection failed') except NetworkError as e: print(e.args) 

Saída
('Connection failed') 

Explicação:

  • NetworkError herda de RuntimeError, que é um tipo de exceção integrado.
  • Quando gerada, a mensagem é armazenada no atributo args como uma tupla.
  • A exceção é capturada e seus argumentos armazenados são exibidos.

Exemplo do mundo real: erro de e-mail inválido

Aqui está um exemplo simples onde levantamos uma exceção personalizada se o endereço de e-mail não for válido:

Python
class InvalidEmailError(Exception): def __init__(self email msg='Invalid email format'): self.email = email self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.email} -> {self.msg}' def set_email(email): if '@' not in email: raise InvalidEmailError(email) print(f'Email set to: {email}') try: set_email('userexample.com') except InvalidEmailError as e: print(e) 

Saída
userexample.com -> Invalid email format 

Explicação:

  • Uma nova classe de exceção InvalidEmailError é definida para validar endereços de e-mail.
  • Se o e-mail fornecido não contiver '@' a exceção será gerada.
  • O bloco try-except detecta o erro e imprime a mensagem formatada.

Quando usar exceções definidas pelo usuário?

As exceções definidas pelo usuário devem ser consideradas nos seguintes cenários:

  • Representando erros específicos em um aplicativo (por exemplo, InvalidAgeError DatabaseConnectionError).
  • Fornecendo mensagens de erro mais claras e descritivas.
  • Lidar com um grupo de erros relacionados separadamente usando exceto.

Ao usar exceções definidas pelo usuário, os programas tornam-se mais legíveis, de manutenção e mais fáceis de depurar.