Atualizado: 04/11/2024

Levantando Exceções e Criando Exceções Personalizadas

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.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com