Lendo mensagens de erro e um pequeno projeto
Um traceback do Python se lê de baixo para cima: a última linha nomeia o erro, e a linha de código acima mostra onde ele aconteceu.
Uma mariposa colada num diário de bordo em 1947
Hoje a maioria dos bugs são erros no código, e o Python é bom em avisar dos que consegue detectar. Os iniciantes muitas vezes veem um erro em vermelho como um veredicto. Ele se parece mais com uma nota de entrega: o que deu errado, em que linha e em que trecho de código. O truque é saber onde olhar.
Leia um traceback de baixo para cima
total = 0
count = 0
print(total / count)Traceback (most recent call last):
File "main.py", line 3, in <module>
print(total / count)
~~~~~~^~~~~~~
ZeroDivisionError: division by zeroComece pela última linha. ZeroDivisionError: division by zero dá o tipo de erro e uma explicação curta. Depois suba até a linha File: o nome do arquivo (no seu computador aparece o caminho completo da pasta; aqui ele foi encurtado para main.py) e o número da linha, 3. A linha abaixo é o próprio código, e o Python 3.12 marca a operação exata que falhou com ^ sob o sinal /. Só depois de ler as três coisas você deve começar a mudar algo. Quando o erro acontece dentro de uma função, o traceback lista todas as chamadas no caminho, e a linha File mais de baixo costuma ser a primeira a olhar.
| Erro | Causa habitual | Exemplo |
|---|---|---|
| SyntaxError | A linha não é Python válido: falta parêntese, dois-pontos ou aspas | print("hi" |
| IndentationError | Recuo ausente ou irregular | if x > 1: sem linha recuada |
| NameError | Um nome que ainda não existe, muitas vezes um erro de digitação | pritn("hi") |
| TypeError | Uma operação com o tipo errado | "Age: " + 15 |
| ValueError | Tipo certo, valor impossível | int("abc") |
| IndexError | Índice além do fim de uma lista ou string | [1, 2][2] |
| KeyError | Chave que não está no dicionário | {"a": 1}["b"] |
| ZeroDivisionError | Divisão por zero | 5 / 0 |
Um SyntaxError é diferente dos outros. O Python o encontra antes de executar qualquer coisa, então nem a linha 1 roda, e não há cabeçalho "Traceback". Todos os outros acontecem durante a execução do programa, depois que as linhas anteriores já fizeram seu trabalho. Quando você espera um erro específico, pode capturá-lo com try e except, que o tutorial trata no capítulo sobre erros: o Python tenta o bloco recuado e, se esse erro acontecer, executa o bloco except em vez de parar.
print("before")
n = int("abc")
print("after")before
Traceback (most recent call last):
File "main.py", line 2, in <module>
n = int("abc")
^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'text = "abc"
try:
n = int(text)
except ValueError:
n = 0
print(n)0Os bugs mais difíceis não dão mensagem nenhuma. Um erro de lógica é um programa que roda e imprime a resposta errada, como o programa de notas da unidade sobre if que deu C a 85. O Python não tem como saber o que você quis dizer. Nesses casos, volte à tabela de rastreamento ou acrescente linhas print temporárias que mostrem as variáveis a cada passo e remova-as quando achar o bug.
Pequeno projeto: um caderno de mesada
O projeto usa algo de quase todas as unidades: um dicionário de gastos, uma função que devolve um total, um laço for, uma f-string e um if. Digite, execute e depois faça do seu jeito: mude os itens, acrescente uma categoria ou avise quando um item custar mais da metade da mesada.
def total(spent):
t = 0
for amount in spent.values():
t += amount
return t
allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
print(f"{item}: {amount} won")
print(f"Spent {used}, left {left}")
if left < 15000:
print("Less than half left")snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half leftAntes de mudar, faça uma tabela de rastreamento de used e left e preveja o que acontece se você acrescentar um item de 6000 won. Depois depure de propósito: apague os dois-pontos depois da linha def, escreva spent errado uma vez e divida used por zero. Leia cada traceback de baixo para cima antes de corrigir. Saber quebrar um programa e consertá-lo de novo é a habilidade de verdade que este curso foi construindo.
| traceback | O relatório de erros do Python; leia de baixo para cima |
| SyntaxError | Código inválido, encontrado antes de qualquer execução |
| NameError | Um nome que não existe, muitas vezes um erro de digitação |
| TypeError | Uma operação com um valor do tipo errado |
| ValueError | O tipo certo com um valor impossível, como int("abc") |
| erro de lógica | Roda sem mensagem, mas dá a resposta errada |
| try / except | Executa o bloco except em vez de parar quando esse erro acontece |
- Qual linha de um traceback nomeia o tipo de erro?
- A primeira linha
- A linha File
- A última linha
- A linha com as marcas ^
- Que erro
int("12a")causa?- TypeError
- ValueError
- NameError
- SyntaxError
- Que erro
pritn("hi")causa?- SyntaxError
- NameError
- TypeError
- Nenhum erro
- Um programa imprime a linha 1 e depois para com um erro na linha 2. Que tipo de erro não pode ser a causa?
- SyntaxError
- NameError
- TypeError
- ZeroDivisionError
- O que isto mostra?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - O que acontece quando isto é executado?
print("start") print(5 / 0) print("end")- Imprime start e end
- Imprime start e depois para com ZeroDivisionError
- Para com ZeroDivisionError antes de imprimir qualquer coisa
- Imprime start, inf e end
- Um programa roda sem nenhuma mensagem, mas imprime o total errado. Que tipo de erro é esse?
- SyntaxError
- Erro de lógica
- NameError
- IndentationError
- O que isto mostra?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - Coloque as linhas deste pequeno programa em ordem para ele imprimir o resultado abaixo.Saída
80.0 - Onde está o bug? def avg(nums): return sum(nums) / len(nums), chamada com avg([]).
- a soma de uma lista vazia é um erro
- len([]) é 0, então divide por zero
- return não pode conter uma divisão
- Não há bug
- "O erro está na linha que a mensagem cita, então a correção vai ali." Muitas vezes, mas nem sempre. Na unidade de funções, x = show_area(4, 3) seguido de x * 2 para com TypeError na linha do x * 2, mas o erro de verdade é o print dentro de show_area, que devia ser um return. Leia a linha citada e depois pergunte de onde vieram os valores dela.
- "Pôr tudo dentro de try/except corrige os erros." Isso só os esconde. Capture um erro específico que você espera, como o ValueError de int(input()), e trate-o de um jeito que faça sentido.
- "Nenhuma mensagem de erro significa que o programa está correto." Os erros de lógica passam despercebidos. Teste com entradas cuja resposta você já conhece, inclusive casos extremos como uma lista vazia ou uma idade limite.
- Leia um traceback de baixo para cima: tipo do erro, depois arquivo e linha, depois o código marcado.
- O SyntaxError interrompe o programa antes de a linha 1 rodar; os outros erros o interrompem no meio.
- try/except trata um erro que você espera.
- Os erros de lógica não dão mensagem: rastreie e teste com respostas conhecidas.
- Depurar é quebrar e consertar de propósito até as mensagens parecerem comuns.
Fontes deste curso (6)
- Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
- Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
- Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
- General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
- Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
- Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)
Data de verificação: 2026-10-19