Módulo 9 - Erros e exceções: nível avançado

Relembrando try e except

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Retomar a estrutura try e except do Python básico.
  • Entender o que é uma exceção e como o Python a levanta.
  • Capturar o tipo de erro específico em vez de qualquer erro.
  • Reconhecer por que um except genérico esconde problemas.

O básico do try e except, revisto

No Curso de Python Básico você viu que certas operações podem falhar em tempo de execução. Converter o texto "abc" em número com int() não dá certo, dividir por zero não dá certo, acessar uma chave que não existe num dicionário não dá certo. Quando isso acontece, o Python levanta uma exceção. Se ninguém a trata, o programa para na hora e imprime um traceback, aquele bloco vermelho que assusta no começo. O try e o except existem para você reagir a essas situações em vez de deixar o programa quebrar.

texto = "abc"

try:
    numero = int(texto)
    print("Deu certo:", numero)
except ValueError:
    print("Isso não é um número válido.")

# Saída:
# Isso não é um número válido.

O int() falha com ValueError; o except reage sem derrubar o programa.

A lógica é simples de ler em voz alta: tente executar o que está no try; se surgir uma exceção do tipo indicado no except, pule para o bloco do except e siga em frente. Sem o try, o programa mostraria algo como ValueError: invalid literal for int() with base 10: 'abc' e pararia. Com o try, ele apenas avisa e continua. A parte que muda de nível no intermediário não é a estrutura, que você já conhece, e sim a disciplina de capturar o erro certo.

Capturar o erro certo, não qualquer erro

É tentador escrever except: sem dizer o tipo, ou except Exception:, para pegar tudo de uma vez. O problema é que isso captura até o que você nem imaginava, inclusive erros de digitação no seu próprio código. Imagine que você escreveu numeor em vez de numero dentro do try. Um except genérico engoliria esse NameError junto com o ValueError, e o programa mostraria a mensagem errada de tratamento em vez de apontar o bug de verdade. Capturar o tipo específico deixa passar o que você não previu, e é isso que você quer: um erro inesperado deve aparecer, não sumir.

except genérico (evite)

  • except: pega qualquer coisa
  • Esconde erros de digitação e bugs
  • Mostra a mensagem errada para o usuário
  • Difícil de depurar depois

except específico (prefira)

  • except ValueError: pega só o previsto
  • Deixa o inesperado aparecer
  • Cada erro tem o tratamento certo
  • O traceback aponta o bug de verdade
def dividir(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("Não dá para dividir por zero.")
        return None

print(dividir(10, 2))  # 5.0
print(dividir(10, 0))  # Não dá para dividir por zero. / None

Capturar ZeroDivisionError trata só a divisão por zero, sem esconder outros erros.

Você também pode ter mais de um except para o mesmo try, cada um cuidando de um tipo. Se um trecho pode falhar por ValueError e por KeyError, escreva os dois blocos e dê a mensagem certa para cada caso. O Python testa os except de cima para baixo e roda o primeiro que combinar com a exceção levantada. Essa clareza vale ouro quando o programa cresce: quem lê o código entende exatamente o que pode dar errado ali e o que acontece em cada situação.

Fixando o try e except

Antes de seguir, vale amarrar a ideia central desta aula. O try e o except não servem para calar todo e qualquer erro. Eles servem para você reagir, de propósito, a falhas que você já esperava, deixando os erros imprevistos aparecerem para serem corrigidos. Escrever except com o tipo certo é a diferença entre um programa que confunde e um programa em que dá para confiar. Nas próximas aulas você vai somar peças a essa base: o else e o finally, o raise e as suas próprias exceções.

Teste rápido

Por que capturar ValueError é melhor que usar um except genérico?

Perguntas frequentes

Qual a diferença entre um erro e uma exceção no Python?
Na prática do dia a dia, os termos se misturam. Tecnicamente, exceção é o objeto que o Python cria quando algo dá errado em tempo de execução, como ZeroDivisionError. Erros de sintaxe, por outro lado, impedem o programa de rodar e não são tratáveis com try e except.
Posso ter vários except para o mesmo try?
Sim, e é comum. Você escreve um except para cada tipo de exceção que quer tratar de forma diferente, por exemplo um para ValueError e outro para KeyError. O Python roda o primeiro que combinar com a exceção levantada, testando de cima para baixo.
O que acontece se eu não tratar uma exceção?
O programa para na linha onde o erro aconteceu e o Python imprime um traceback, mostrando o tipo do erro, a mensagem e o caminho até ali. Em produção, isso significa uma queda; por isso você trata as falhas que consegue prever.
É sempre errado usar except Exception?
Nem sempre, mas é raro ser a melhor opção. Ele faz sentido em pontos bem definidos, como o topo de um programa que registra qualquer falha e segue. No meio da lógica, prefira o tipo específico, para não esconder bugs que você deveria consertar.
Como sei qual tipo de exceção capturar?
Rode o código e leia o traceback: a última linha mostra o tipo, como ValueError ou KeyError. A documentação oficial lista as exceções embutidas do Python com o que cada uma significa. Com o tempo, os tipos mais comuns ficam na ponta da língua.
O try e except deixam o programa mais lento?
Quando não há erro, o custo é irrelevante: entrar num bloco try é praticamente de graça. O custo só aparece quando uma exceção é de fato levantada e tratada. Portanto, use sem medo para proteger trechos que podem falhar.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.