Mensagens de erro em Python: como ler e corrigir bugs comuns
Este tutorial foi traduzido do original em inglês.Read in EnglishLeer en españolЧитать на русскомอ่านภาษาไทยAvisar sobre um erro de tradução
Quando iniciantes veem uma mensagem de erro em vermelho, o primeiro instinto é entrar em pânico. A tela se enche de um texto assustador, e a pessoa acha que causou um estrago sério. Mas a verdade é esta: as mensagens de erro são suas melhores amigas. Elas dizem exatamente o que deu errado e onde.
Programadores profissionais encontram erros todos os dias. A diferença entre um iniciante e um especialista não é que o especialista evita erros: é que ele sabe lê-los. Depois que você aprende a ler as mensagens de erro do Python, a depuração deixa de ser assustadora e vira algo quase automático.
Neste tutorial, você vai aprender a ler um traceback do Python, entender os seis tipos de erro mais comuns e montar um kit mental de ferramentas para corrigir bugs rapidamente.
Como ler um traceback do Python
Quando o Python encontra um erro, ele exibe um traceback: um relatório que conta o que aconteceu. A maioria das pessoas lê tracebacks de cima para baixo. É justamente o contrário do que se deve fazer. Comece sempre pela última linha.
Traceback (most recent call last): File "<exec>", line 5, in <module> File "<exec>", line 2, in greet TypeError: can only concatenate str (not "int") to str
Quando você executa este código, o Python mostra um traceback. Veja como lê-lo, começando de baixo:
SyntaxError: o Python não entende seu código
Um SyntaxError significa que o Python nem consegue começar a executar seu código, porque a estrutura está errada. É como um erro de gramática em português: a frase não faz sentido. O Python detecta esses erros antes de executar uma única linha.
SyntaxError: expected ':' (<string>, line 1) Common SyntaxError causes: 1. Missing colon after if/else/for/while/def 2. Mismatched parentheses or quotes 3. Using = instead of == in conditions 4. Incorrect indentation
A boa notícia: os SyntaxErrors costumam ser os mais rápidos de corrigir. Muitas vezes o Python aponta direto para o problema com uma pequena seta (^) que mostra onde ele se confundiu.
if temperature > 30
print('Hot!')if temperature > 30:
print('Hot!')NameError: o Python não encontra esse nome
Um NameError significa que você usou um nome de variável ou de função que o Python não reconhece. Em geral, isso indica um erro de digitação, uma variável que você esqueceu de definir ou que usou antes de atribuir um valor.
NameError: name 'usernme' is not defined NameError: name 'score' is not defined
total_price = 49.99
print(total_prce) # typo!total_price = 49.99
print(total_price)TypeError: tipo errado para a operação
Um TypeError significa que você tentou fazer algo com o tipo de dado errado. Por exemplo, somar uma string com um número ou chamar algo que não é uma função. O Python entende o que você pediu, mas os tipos não combinam.
TypeError: can only concatenate str (not "int") to str TypeError: can't multiply sequence by non-int of type 'str' TypeError: add() takes 2 positional arguments but 3 were given
Os TypeErrors aparecem muito quando você trabalha com a entrada do usuário (que é sempre uma string) ou quando uma função retorna None sem você esperar.
age = 25
print('You are ' + age + ' years old')age = 25
print(f'You are {age} years old')IndexError e KeyError: acessando o que não existe
Um IndexError acontece quando você tenta acessar uma posição da lista que não existe. Um KeyError acontece quando você tenta acessar uma chave do dicionário que não existe. Os dois significam que você está tentando pegar algo que não está lá.
IndexError: list index out of range List length: 3 Valid indices: 0 to 2 KeyError: 'email'
Nos dicionários, você pode evitar o KeyError usando o método .get(), que retorna um valor padrão em vez de travar o programa.
user = {'name': 'Alice'}
email = user['email'] # KeyError!user = {'name': 'Alice'}
email = user.get('email', 'Not provided')
print(email) # Not providedValueError: tipo certo, valor errado
Um ValueError significa que o tipo está certo, mas o valor em si não faz sentido para a operação. O exemplo clássico: tentar converter uma string que não é numérica em um número inteiro.
ValueError: invalid literal for int() with base 10: 'hello' ValueError: invalid literal for int() with base 10: '3.14' Converted: 3
Os ValueErrors aparecem com frequência ao processar a entrada do usuário. A pessoa pode digitar "vinte" em vez de "20", ou deixar um campo em branco. Valide sempre a entrada antes de convertê-la.
"abc" is not a valid number
Dicas comuns de depuração
Aqui está um guia de consulta rápida para depurar código Python. Essas técnicas funcionam para qualquer tipo de erro.
Esta é uma referência rápida dos erros que você vai encontrar com mais frequência:
| Erro | O que significa | Correção rápida |
|---|---|---|
SyntaxError | A estrutura do código está errada | Confira dois-pontos, parênteses e aspas |
NameError | Variável ou função não encontrada | Confira a grafia, defina antes de usar |
TypeError | Tipo de dado errado | Converta os tipos ou confira os argumentos da função |
IndexError | Índice da lista fora do intervalo | Confira o tamanho da lista, lembre que os índices começam em 0 |
KeyError | Chave do dicionário não encontrada | Use .get() ou confira se a chave existe |
ValueError | Tipo certo, valor errado | Valide os dados antes de converter |
Exercícios práticos
Hora de praticar suas habilidades de depuração! A maioria destes exercícios traz código com erro para você corrigir. Leia a mensagem de erro, encontre o bug e conserte.
Este código tem um SyntaxError. Encontre e corrija o erro para que ele exiba:
Python is fun!
Let's learn more.Este código tem um NameError. Encontre o erro de digitação e corrija-o para que o código exiba:
Hello, Alice! You have 3 new messages.Este código tem um TypeError. Corrija-o para que ele exiba:
Your total is $37.5Este código tenta exibir a última cor, mas trava com um IndexError. Corrija-o para que ele exiba:
Last color: greenEste código trava ao tentar converter uma string de preço em um número inteiro. Corrija-o para que ele exiba:
Price in cents: 999O preço é "9.99" dólares, e queremos convertê-lo em centavos (multiplicar por 100 e transformar o resultado em um número inteiro).
Este código dá erro em cada uma das suas três seções, mas uma única correção pode resolver duas delas. Corrija-o para que a saída seja:
Student: Alice
Grade: 85
Passed: TrueResumo: mensagens de erro em Python
Esta é sua referência rápida para os erros mais comuns do Python:
| Erro | Significado | O que conferir primeiro |
|---|---|---|
SyntaxError | Estrutura do código inválida | Dois-pontos, parênteses e aspas faltando |
NameError | Variável desconhecida | Grafia, ordem das definições |
TypeError | Tipo errado | Confira os tipos com type() |
IndexError | Índice de lista inválido | Tamanho da lista, índices a partir de 0 |
KeyError | Chave de dicionário inválida | Use .get() com um valor padrão |
ValueError | Valor errado | Valide antes de converter |
As regras de ouro da depuração:
print(type(x), x) para inspecionar variáveis suspeitasO que vem a seguir?
Agora que você sabe ler mensagens de erro, está pronto para encarar com confiança assuntos mais complexos do Python. Siga para Listas em Python e conheça uma das estruturas de dados mais poderosas e versáteis do Python.