Como ler uma mensagem de erro em Python sem pânico (com exemplos reais)
Para ler um erro em Python, comece pela última linha: ela diz o tipo do erro e o motivo. Depois olhe o número depois de line, que aponta a linha com problema, e os sinais ^, que marcam o trecho exato. Corrija uma coisa de cada vez e rode de novo. O erro não é uma bronca, é uma pista.
O erro é uma pista, não uma bronca
Quem programa vê erros todos os dias, e isso inclui profissionais com anos de experiência. A diferença entre quem está começando e quem já tem prática é que o experiente sabe ler a mensagem. Esse artigo ensina a leitura, com erros reais do Python.
Os exemplos mostram o nome programa.py no lugar do caminho completo do arquivo, que muda de computador para computador. A mensagem também pode variar um pouco entre versões do Python, mas a estrutura é a mesma.
A anatomia de um erro
Este programa tenta dividir por zero:
numero = 10
print(numero / 0)
E o Python responde assim:
Traceback (most recent call last):
File "programa.py", line 2, in <module>
print(numero / 0)
~~~~~~~^~~
ZeroDivisionError: division by zero
Leia de baixo para cima:
- Última linha:
ZeroDivisionError: division by zero. O começo é o tipo do erro, e depois dos dois-pontos vem o motivo: houve uma divisão por zero. - Linha do arquivo:
line 2. O problema apareceu na linha 2. - Trecho em destaque: os sinais
~e^mostram a parte exata do código que causou o erro. - Traceback: é o nome do relatório inteiro. Ele mostra o caminho percorrido até o erro, e quanto mais alto, mais antigo.
SyntaxError: faltou alguma coisa na escrita
Um erro de sintaxe acontece quando o Python não entende como a linha foi escrita, e por isso o programa nem começa a rodar. Aqui falta o dois-pontos no if:
idade = 18
if idade >= 18
print("maior")
File "programa.py", line 2
if idade >= 18
^
SyntaxError: expected ':'
A mensagem diz exatamente o que esperava: expected ':', ou seja, "esperava dois-pontos". O sinal ^ aponta onde ele devia estar. Repare que nesse tipo de erro não aparece a palavra Traceback.
IndentationError: o recuo está errado
No Python, o recuo faz parte da escrita. O código dentro de um for precisa estar mais para a direita:
for n in range(3):
print(n)
File "programa.py", line 2
print(n)
^^^^^
IndentationError: expected an indented block after 'for' statement on line 1
Tradução: "esperava um bloco com recuo depois do for da linha 1". A solução é adicionar quatro espaços antes do print.
NameError: o nome não existe
Acontece quando você usa um nome que o Python não conhece, quase sempre por erro de digitação:
nome = "Ana"
print(nmoe)
Traceback (most recent call last):
File "programa.py", line 2, in <module>
print(nmoe)
^^^^
NameError: name 'nmoe' is not defined
A mensagem diz que nmoe não está definido. Basta comparar com o nome que você criou: era nome.
TypeError: tipos que não combinam
Aqui o "5" está entre aspas, então é texto, e o Python não soma texto com número:
idade = "5"
print(idade + 3)
Traceback (most recent call last):
File "programa.py", line 2, in <module>
print(idade + 3)
~~~~~~^~~
TypeError: can only concatenate str (not "int") to str
Traduzindo: só dá para juntar texto (str) com outro texto, e não com um número inteiro (int). A correção é converter o texto em número com int(idade).
IndexError: a posição não existe
Listas contam as posições a partir do zero. Esta lista tem três itens, nas posições 0, 1 e 2, e o código pede a posição 5:
lista = [1, 2, 3]
print(lista[5])
Traceback (most recent call last):
File "programa.py", line 2, in <module>
print(lista[5])
~~~~~^^^
IndexError: list index out of range
"Índice fora do alcance" é a forma do Python dizer que essa posição não existe na lista.
O passo a passo para corrigir qualquer erro
- Leia a última linha e anote o tipo do erro.
- Vá até a linha indicada e olhe os sinais
^. - Pense no que costuma causar aquele tipo de erro (veja os exemplos acima: dois-pontos, recuo, nome digitado errado, tipos misturados).
- Mude uma coisa de cada vez e rode de novo. Mudar três coisas juntas esconde o que resolveu.
- Se a mensagem mudou, você avançou. Leia a nova e repita.
Como pedir ajuda do jeito certo
Se não resolver, pedir ajuda faz parte do ofício. Para receber resposta rápida, mande: a mensagem de erro completa, o trecho do código que causa o erro (o menor possível), o que você esperava que acontecesse e o que já tentou. Isso ajuda quem responde e também te ajuda a pensar.
Provoque o erro e leia a mensagem
Rode o código abaixo. Depois troque nome por nmoe na segunda linha, rode de novo e leia a mensagem da última linha. Conserte e rode outra vez.
nome = "Ana"
print(nome)
Resultado esperado:
Ana
Errar de propósito é uma das melhores formas de treinar. Na versão com nmoe, você deve ver NameError: name 'nmoe' is not defined na última linha.
Perguntas frequentes
O que é traceback?
É o relatório que o Python mostra quando algo dá errado. Ele lista o caminho do código até o erro, com os arquivos, as linhas e, no final, o tipo e o motivo do erro.
Por que a mensagem de erro está em inglês?
O Python mostra as mensagens em inglês por padrão. Os nomes dos tipos, como NameError e TypeError, são os mesmos no mundo todo, o que ajuda na hora de pesquisar a solução.
Qual a diferença entre erro de sintaxe e erro de execução?
O erro de sintaxe acontece antes de o programa rodar, porque o código está escrito de um jeito que o Python não entende. O erro de execução acontece durante o programa, quando uma linha válida tenta fazer algo impossível, como dividir por zero.
Quais erros mais aparecem no começo?
Em geral SyntaxError, NameError, IndentationError e TypeError. Todos têm causas simples e se resolvem rápido depois que você aprende a ler a mensagem.
Fontes e para saber mais
Próximo passo da trilhaComo treinar lógica de programação online e de graça (método e exercícios)