Como definir exceções personalizadas em Python? (Com exemplos)

Neste tutorial, você aprenderá como definir exceções customizadas dependendo de seus requisitos com a ajuda de exemplos.

Python tem várias exceções integradas que forçam seu programa a gerar um erro quando algo der errado no programa.

No entanto, às vezes você pode precisar criar suas próprias exceções personalizadas que atendam ao seu propósito.

Criação de exceções personalizadas

No Python, os usuários podem definir exceções personalizadas criando uma nova classe. Essa classe de exceção deve ser derivada, direta ou indiretamente, da Exceptionclasse interna. A maioria das exceções internas também são derivadas dessa classe.

 >>> class CustomError(Exception):… pass… >>> raise CustomError Traceback (most recent call last):… __main__.CustomError >>> raise CustomError("An error occurred") Traceback (most recent call last):… __main__.CustomError: An error occurred

Aqui, criamos uma exceção definida pelo usuário chamada CustomErrorque herda da Exceptionclasse. Essa nova exceção, como outras exceções, pode ser gerada usando a raiseinstrução com uma mensagem de erro opcional.

Quando estamos desenvolvendo um grande programa Python, é uma boa prática colocar todas as exceções definidas pelo usuário que nosso programa gera em um arquivo separado. Muitos módulos padrão fazem isso. Eles definem suas exceções separadamente como exceptions.pyou errors.py(geralmente, mas não sempre).

A classe de exceção definida pelo usuário pode implementar tudo que uma classe normal pode fazer, mas geralmente as tornamos simples e concisas. Muitas implementações declaram uma classe base customizada e derivam outras classes de exceção desta classe base. Esse conceito fica mais claro no exemplo a seguir.

Exemplo: exceção definida pelo usuário em Python

Neste exemplo, ilustraremos como as exceções definidas pelo usuário podem ser usadas em um programa para gerar e detectar erros.

Este programa pedirá ao usuário para inserir um número até adivinhar um número armazenado corretamente. Para ajudá-los a descobrir, é fornecida uma dica se sua estimativa é maior ou menor que o número armazenado.

 # define Python user-defined exceptions class Error(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(Error): """Raised when the input value is too small""" pass class ValueTooLargeError(Error): """Raised when the input value is too large""" pass # you need to guess this number number = 10 # user guesses a number until he/she gets it right while True: try: i_num = int(input("Enter a number: ")) if i_num number: raise ValueTooLargeError break except ValueTooSmallError: print("This value is too small, try again!") print() except ValueTooLargeError: print("This value is too large, try again!") print() print("Congratulations! You guessed it correctly.")

Aqui está um exemplo de execução deste programa.

Insira um número: 12 Este valor é muito grande, tente novamente! Insira um número: 0 Este valor é muito pequeno, tente novamente! Insira um número: 8 Este valor é muito pequeno, tente novamente! Digite um número: 10 Parabéns! Você adivinhou corretamente.

Definimos uma classe base chamada Error.

As outras duas exceções ( ValueTooSmallErrore ValueTooLargeError) que são realmente geradas por nosso programa são derivadas dessa classe. Esta é a forma padrão de definir exceções definidas pelo usuário na programação Python, mas você não está limitado apenas a esta forma.

Personalização de classes de exceção

Podemos personalizar ainda mais essa classe para aceitar outros argumentos de acordo com nossas necessidades.

Para aprender a personalizar as classes Exception, você precisa ter o conhecimento básico de programação orientada a objetos.

Visite Python Object Oriented Programming para começar a aprender sobre a programação orientada a objetos em Python.

Vejamos um exemplo:

 class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)

Resultado

 Insira o valor do salário: 2000 Traceback (última chamada mais recente): Arquivo "", linha 17, em aumento SalaryNotInRangeError (salário) __main __. SalaryNotInRangeError: O salário não está no intervalo (5000, 15000)

Aqui, substituímos o construtor da Exceptionclasse para aceitar nossos próprios argumentos personalizados salarye message. Em seguida, o construtor da Exceptionclasse pai é chamado manualmente com o self.messageargumento using super().

O self.salaryatributo personalizado é definido para ser usado posteriormente.

O __str__método herdado da Exceptionclasse é então usado para exibir a mensagem correspondente quando SalaryNotInRangeErroré gerado.

Também podemos personalizar o __str__próprio método substituindo-o.

 class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) def __str__(self): return f'(self.salary) -> (self.message)' salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)

Resultado

 Insira o valor do salário: 2000 Traceback (última chamada mais recente): Arquivo "/home/bsoyuj/Desktop/Untitled-1.py", linha 20, em aumento SalaryNotInRangeError (salário) __main __. SalaryNotInRangeError: 2000 -> O salário não está em ( 5000, 15000) intervalo

Para saber mais sobre como lidar com exceções em Python, visite Python Exception Handling.

Artigos interessantes...