Tratamento de Exceções (try e except)

O tratamento de exceções usa os blocos try e except para lidar com erros em tempo de execução, permitindo que o programa se recupere e continue.

Exceções Específicas Detalhadas

É crucial capturar a exceção mais específica possível para diagnosticar o problema corretamente.

Exceção Quando Ocorre Exemplo de Código
ValueError Quando uma função recebe um argumento com o tipo correto, mas com um valor inapropriado. Tentar converter uma string que não é um número para um inteiro: int("texto").
ZeroDivisionError Quando o denominador de uma operação de divisão é zero. A operação matemática 10 / 0.
Exception A classe base para a maioria das exceções. Usada para capturar qualquer erro não especificado. Usar except Exception as e: é um bom método de segurança, mas deve ser usado após tentar capturar erros específicos.

Exemplo 1: ValueError (Valor Inapropriado)

Esta exceção ocorre quando o tipo de dado é correto (ex: estamos usando str com int()), mas o valor da string não pode ser convertido (ex: "olá" não pode virar um número).

def tratar_value_error():
    print("\\n--- Exemplo 1: ValueError ---")
    
    entrada = input("Digite sua idade (apenas números): ")
    
    try:
        # Tenta converter a entrada (str) em um número inteiro (int)
        idade = int(entrada)
        print(f"Idade válida salva: {idade} anos.")
        
    except ValueError:
        # É capturado se a entrada for, por exemplo, "vinte" ou "30a"
        print("ERRO DE VALOR: A entrada não pôde ser convertida para um número inteiro.")
        print("Tente novamente digitando apenas dígitos.")

def main():
    tratar_value_error()

if __name__ == "__main__":
    main()

Exemplo 2: ZeroDivisionError (Divisão por Zero)

Esta é uma exceção puramente matemática. Ocorre quando o denominador de uma divisão é zero.

def tratar_zero_division_error():
    print("\\n--- Exemplo 2: ZeroDivisionError ---")
    
    try:
        num1 = 10
        num2 = 0
        
        # O código falha aqui, pois a divisão por zero é indefinida
        resultado = num1 / num2
        
        print(f"Resultado: {resultado}") # Esta linha nunca será executada
        
    except ZeroDivisionError:
        # É capturado se ocorrer a divisão por zero
        print(f"ERRO DE DIVISÃO: A operação {num1} / {num2} é inválida.")
        print("A divisão por zero não é permitida.")

def main():
    tratar_zero_division_error()

if __name__ == "__main__":
    main()

Exemplo 3: IndexError (Índice Inválido)

Embora você tenha pedido Exception, vamos usar um erro muito comum (IndexError) e depois mostrar como Exception pode capturá-lo de forma genérica.