Exceções personalizadas do Python
Exceções personalizadas do Python
Neste tutorial, você aprenderá como definir exceções personalizadas dependendo de seus requisitos com a ajuda de exemplos.
Python tem inúmeras exceções internas que forçam seu programa a gerar um erro quando algo no programa dá errado.
No entanto, às vezes você pode precisar criar suas próprias exceções personalizadas que atendam ao seu propósito.
Criando exceções personalizadas
Em Python, os usuários podem definir exceções personalizadas criando uma nova classe. Essa classe de exceção deve ser derivada, direta ou indiretamente, do
Exception
integrado classe. 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
CustomError
que herda do Exception
classe. Esta nova exceção, como outras exceções, pode ser gerada usando o raise
instrução com uma mensagem de erro opcional. Quando estamos desenvolvendo um programa Python grande, é 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.py
ou errors.py
(geralmente, mas nem sempre). A classe de exceção definida pelo usuário pode implementar tudo o que uma classe normal pode fazer, mas geralmente as tornamos simples e concisas. A maioria das implementações declara uma classe base personalizada e deriva outras classes de exceção dessa classe base. Esse conceito fica mais claro no exemplo a seguir.
Exemplo:exceção definida pelo usuário em Python
Neste exemplo, ilustraremos como 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é que ele adivinhe um número armazenado corretamente. Para ajudá-los a descobrir, é fornecida uma dica se o palpite é 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 ValueTooSmallError
elif 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.
Enter a number: 12 This value is too large, try again! Enter a number: 0 This value is too small, try again! Enter a number: 8 This value is too small, try again! Enter a number: 10 Congratulations! You guessed it correctly.
Definimos uma classe base chamada
Error
. As outras duas exceções (
ValueTooSmallError
e ValueTooLargeError
) que são realmente gerados pelo nosso programa são derivados dessa classe. Essa é a maneira padrão de definir exceções definidas pelo usuário na programação Python, mas você não está limitado apenas a essa forma. Personalizando classes de exceção
Podemos personalizar ainda mais essa classe para aceitar outros argumentos conforme nossas necessidades.
Para aprender a personalizar as classes Exception, você precisa ter o conhecimento básico de programação orientada a objetos.
Visite Programação Orientada a Objetos Python para começar a aprender sobre 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)
Saída
Enter salary amount: 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
Aqui, sobrescrevemos o construtor do
Exception
class para aceitar nossos próprios argumentos personalizados salary
e message
. Então, o construtor do pai Exception
classe é chamada manualmente com o self.message
argumento usando super()
. O
self.salary
personalizado atributo é definido para ser usado posteriormente. O
__str__
herdado método do Exception
class é usado para exibir a mensagem correspondente quando SalaryNotInRangeError
é levantada. 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)
Saída
Enter salary amount: 2000 Traceback (most recent call last): File "/home/bsoyuj/Desktop/Untitled-1.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 -> Salary is not in (5000, 15000) range
Para saber mais sobre como lidar com exceções em Python, visite Python Exception Handling.
python