Python: Tratamento de Exceções
Última atualização: 2026-09-22
Situações inesperadas sempre ocorrem durante a execução do programa — arquivos não existem, rede desconecta, usuários inserem dados inválidos... Sem lidar com essas "exceções," o programa quebra. O tratamento de exceções permite que seu programa se recupere de erros e forneça mensagens amigáveis ao usuário em vez de mensagens de erro enigmáticas.
1. O que é uma Exceção
Uma exceção é um erro que ocorre durante a execução do programa. Se uma exceção não for tratada, o programa termina:
# Este código vai quebrar
# print(10 / 0) # ZeroDivisionError: division by zero
# int("abc") # ValueError: invalid literal for int()
# open("arquivo_inexistente.txt") # FileNotFoundError
Use try-except para lidar com esses erros graciosamente:
▶ Exemplo: try-except Tratando Erros de Divisão e Entrada
try:
number = int(input("Digite um número: "))
result = 10 / number
print(f"10 / {number} = {result}")
except ValueError:
print("Isso não é um número válido!")
except ZeroDivisionError:
print("Não é possível dividir por zero!")
Execução de exemplo:
Digite um número: abc
Isso não é um número válido!
try para "prever todos os erros possíveis," trata-se de "fazer as coisas primeiro e lidar com problemas quando surgirem." A comunidade Python chama isso de: "É mais fácil pedir perdão do que permissão" (EAFP).
2. Estrutura Completa try-except
▶ Exemplo: Estrutura Completa try-except-else-finally
try:
# Código que pode dar error
file = open("data.txt", "r", encoding="utf-8")
content = file.read()
number = int(content)
print(f"O número é: {number}")
except FileNotFoundError:
print("Arquivo não encontrado!")
except ValueError:
print("O conteúdo do arquivo não é um número válido!")
else:
# Executa quando nenhuma exceção ocorre
print("Lido e convertido com sucesso!")
finally:
# Sempre executa, independentemente de exceções
print("Limpeza: fechando arquivo")
try:
file.close()
except NameError:
pass
| Parte | Quando executa | Propósito |
|---|---|---|
try |
Sempre | Coloque código propenso a erros aqui |
except |
Quando a exceção especificada ocorre | Lida com o erro |
else |
Quando nenhuma exceção ocorre | Lógica após sucesso |
finally |
Sempre (com ou sem exceção) | Limpar recursos (fechar arquivos/liberar conexões) |
else é usado com menos frequência, enquanto finally é usado extensivamente. A declaração with (context manager) gerencia a liberação de recursos automaticamente e pode frequentemente substituir finally.
3. Tipos de Exceção Comuns
# ZeroDivisionError — divisão por zero
# int("abc") # ValueError — value inválido
# [1, 2][5] # IndexError — índice fora do intervalo
# {"a": 1}["b"] # KeyError — chave não existe
# open("x.txt") # FileNotFoundError — arquivo não encontrado
# 10 + "hello" # TypeError — error de tipo
# import nonexistent # ModuleNotFoundError — módulo não encontrado
(1) Capturando Todas as Exceções (Não Recomendado)
▶ Exemplo: Forma Correta vs Errada de Capturar Exceções
▶ ExperimenteSaída:
Algo deu errado
except: sem especificação não é recomendado — ele captura exceções do sistema como KeyboardInterrupt (Ctrl+C) e SystemExit, impedindo o término normal do programa. Use except Exception as e em vez disso. A melhor prática é capturar apenas os tipos específicos de exceção que você espera.
4. raise: Levantando Exceções Explicitamente
Às vezes você precisa informar ao chamador "algo deu errado." Use raise:
▶ Exemplo: raise para Levantar uma Exceção
▶ ExperimenteSaída:
# Function defined successfully
▶ Exemplo de Verificação de Força de Senha
▶ Exemplo: raise para Validação de Senha
▶ ExperimenteSaída:
# Function defined successfully
raise? Quando uma função encontra uma situação que "não deveria acontecer" — valores de parâmetros inválidos, pré-condições não satisfeitas, dependências indisponíveis. Levante uma exceção para que o chamador decida como lidar, em vez de engolir silenciosamente o erro dentro da função.
5. Classes de Exceção Personalizadas
Você pode criar seus próprios tipos de exceção para informações de erro mais precisas:
▶ Exemplo: Exceções Personalizadas para Saque Bancário
▶ ExperimenteSaída:
# Function defined successfully
Exception; geralmente apenas um nome de classe é suficiente, sem métodos extras necessários.
6. logging: Registro Profissional de Erros
Usar print() para mensagens de erro funciona em scripts simples, mas em projetos de produção, use o módulo logging:
▶ Exemplo: Configuração e Uso de logging
▶ ExperimenteSaída (escrita tanto em arquivo quanto no console):
2026-06-23 16:00:00,123 [INFO] Aplicativo iniciado com sucesso
2026-06-23 16:00:00,124 [WARNING] Uso de disco em 85%
2026-06-23 16:00:00,124 [ERROR] Falha na conexão com banco de dados
logging sobre print(): 1) Pode exibir no console e em arquivo simultaneamente. 2) Tem controle de nível (mostre tudo durante desenvolvimento, apenas WARNING+ em produção). 3) Inclui timestamps automaticamente. 4) Não precisa deletar um monte de print() antes do lançamento.
7. Casos de Uso Comuns
- Validação de entrada do usuário: Use
try-exceptpara lidar com erros de conversãoint(), fornecendo mensagens amigáveis. - Operações de arquivo: Use
try-exceptpara lidar com arquivo não encontrado, permissão negada e outros erros. - Requisições de rede: Lide com timeouts, falhas de conexão e erros de análise de dados.
- Operações de banco de dados: Lide com falhas de conexão, erros de sintaxe SQL e violações de restrição única.
- Desenvolvimento de API: Use exceções personalizadas para distinguir precisamente diferentes tipos de erro.
❓ Perguntas Frequentes
as e em except Exception as e?as e atribui o objeto de exceção capturado à variável e, permitindo inspecionar os detalhes do erro — print(e) mostra a descrição do erro, type(e).__name__ mostra o nome do tipo de exceção. Sem as e, você ainda pode capturar a exceção mas não pode ver informações detalhadas do erro.if para erros que você pode prever antecipadamente (como verificar divisor zero). Use try-except para erros que você não pode prever (como requisições de rede, operações de arquivo). O estilo EAFP da comunidade Python tende a usar try — mas isso é uma questão de estética, e ambas as abordagens têm seus casos de uso.📖 Resumo
- Exceções são erros em tempo de execução; lide com elas usando
try-except - Estrutura:
try->except(por tipo de exceção específico) ->else(sem exceção) ->finally(sempre executa) - Exceções comuns:
ValueError,TypeError,FileNotFoundError,ZeroDivisionError,IndexError,KeyError raiselança exceções explicitamente, permitindo que o chamador lide com erros- Classes de exceção personalizadas herdam de
Exception, distinguindo precisamente tipos de erro - O módulo
loggingsubstituiprint(), suportando controle de nível, saída em arquivo e timestamps
📝 Exercícios
-
Iniciante (Dificuldade ⭐): Escreva um programa que peça ao usuário dois números e calcule sua divisão. Use
try-exceptpara lidar comValueError(entrada não é número) eZeroDivisionError(divisão por zero), cada um com uma mensagem de erro amigável. -
Intermediário (Dificuldade ⭐⭐): Escreva uma função
read_int_from_file(filename)que lê o primeiro número de um arquivo e o retorna. Use try-except para lidar com: arquivo não encontrado, conteúdo do arquivo não é um número válido, arquivo vazio. Retorne uma mensagem de erro diferente para cada caso. -
Avançado (Dificuldade ⭐⭐⭐): Escreva um programa "calculadora segura." O usuário digita uma expressão (ex.:
10 / 3), e o programa calcula e exibe o resultado. Requisitos: 1) Usetry-exceptpara lidar com divisão por zero, erros de valor e erros de tipo. 2) Useloggingpara registrar cada operação de cálculo (INFO) e erro (ERROR) em um arquivocalculator.log. 3) Suporteexitpara sair. Dica: Useeval()para avaliar a expressão (note preocupações de segurança — aceitável para este exercício).