Levantando Exceções e Criando Exceções Personalizadas em Python
Levantando Exceções com a Instrução raise
Em alguns casos, é necessário levantar manualmente uma exceção específica. Para isso, usamos a instrução raise. Abaixo está um exemplo de como levantar uma exceção personalizada:
try:
age = int(input("Digite a idade: "))
if age > 110 or age < 1:
raise Exception("Idade inválida")
print("Sua idade:", age)
except ValueError:
print("Dados fornecidos são inválidos")
except Exception as e:
print(e)
print("Programa finalizado")
A instrução raise
recebe um objeto do tipo BaseException
, que, neste caso, é um objeto Exception
. Podemos incluir uma mensagem personalizada na exceção para exibi-la ao usuário. Assim, se o valor de age for maior que 110 ou menor que 1, o raise
levanta uma exceção, e o controle do programa passa para o bloco except
, que trata exceções do tipo Exception
.
Exemplo de execução:
Digite a idade: 100500 Idade inválida Programa finalizado
Criando Tipos de Exceções Personalizadas
No Python, não estamos limitados apenas aos tipos de exceções integrados. Podemos, por meio de herança, criar nossos próprios tipos de exceção quando necessário. Vejamos o exemplo da classe Person
:
class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age
def display_info(self):
print(f"Nome: {self.__name} Idade: {self.__age}")
Aqui, a classe Person
recebe valores para nome e idade no construtor e os atribui a variáveis privadas __name
e __age
. No entanto, ao criar um objeto Person, podemos passar para o construtor um valor inválido: por exemplo, uma idade negativa. Para lidar com essa situação, podemos levantar uma exceção caso valores inválidos sejam fornecidos.
O código a seguir implementa essa ideia:
class PersonAgeException(Exception):
def __init__(self, age, min_age, max_age):
self.age = age
self.min_age = min_age
self.max_age = max_age
def __str__(self):
return (f"Valor inválido: {self.age}. "
f"A idade deve estar entre {self.min_age} e {self.max_age}")
class Person:
def __init__(self, name, age):
self.__name = name # define o nome
min_age, max_age = 1, 110
if min_age < age < max_age: # define a idade se o valor for válido
self.__age = age
else: # caso contrário, levanta uma exceção
raise PersonAgeException(age, min_age, max_age)
def display_info(self):
print(f"Nome: {self.__name} Idade: {self.__age}")
try:
tom = Person("Tom", 37)
tom.display_info() # Nome: Tom Idade: 37
bob = Person("Bob", -23)
bob.display_info()
except PersonAgeException as e:
print(e) # Valor inválido: -23. A idade deve estar entre 1 e 110
Neste exemplo, a classe PersonAgeException
é definida para tratar exceções relacionadas à idade. Este tipo de exceção herda de Exception
, como é comum em exceções personalizadas. O construtor de PersonAgeException
recebe três valores: o valor inválido da idade, a idade mínima e a idade máxima permitidas.
No método __str__
, definimos a mensagem de erro que será exibida quando a exceção for levantada.
Dentro do construtor da classe Person
, validamos o valor da idade. Se o valor não estiver dentro do intervalo permitido, uma exceção do tipo PersonAgeException
é levantada:
raise PersonAgeException(age, min_age, max_age)
Ao utilizar a classe Person
, é importante considerar que o construtor pode levantar uma exceção ao receber um valor inválido. Por isso, a criação dos objetos Person é envolvida em uma estrutura try..except
:
try:
tom = Person("Tom", 37)
tom.display_info() # Nome: Tom Idade: 37
bob = Person("Bob", -23) # levanta a exceção PersonAgeException
bob.display_info()
except PersonAgeException as e:
print(e) # Valor inválido: -23. A idade deve estar entre 1 e 110
Assim, se o construtor de Person
levantar uma exceção do tipo PersonAgeException
, o controle do programa passa para o bloco except
, que exibe a mensagem de erro.