edubun
Português

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

ContextoEm 1947, engenheiros que trabalhavam no computador Mark II, na Universidade Harvard, encontraram uma mariposa presa num dos componentes. Colaram o inseto no diário de bordo e escreveram ao lado "first actual case of bug being found" (primeiro caso real de bug encontrado). A página está hoje no Museu Nacional de História Americana, do Smithsonian. A descrição do próprio museu é cuidadosa quanto a dois detalhes populares. Os engenheiros já chamavam pequenas falhas de "bugs" muito antes, e Thomas Edison usou a palavra na década de 1870, então a mariposa não inventou o termo; a piada funciona porque a palavra já existia. E Grace Hopper, que fazia parte da equipe do Mark II naquele ano, provavelmente não manteve esse diário, embora ela e a equipe tenham ajudado a tornar "bug" e "debug" palavras do dia a dia de quem programa.

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)
Saída
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total / count)
          ~~~~~~^~~~~~~
ZeroDivisionError: division by zero
Leia na ordem 1, 2, 3: o tipo e a mensagem do erro na última linha, depois o arquivo e o número da linha, depois o trecho de código marcado.

Comece 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.

ErroCausa habitualExemplo
SyntaxErrorA linha não é Python válido: falta parêntese, dois-pontos ou aspasprint("hi"
IndentationErrorRecuo ausente ou irregularif x > 1: sem linha recuada
NameErrorUm nome que ainda não existe, muitas vezes um erro de digitaçãopritn("hi")
TypeErrorUma operação com o tipo errado"Age: " + 15
ValueErrorTipo certo, valor impossívelint("abc")
IndexErrorÍndice além do fim de uma lista ou string[1, 2][2]
KeyErrorChave que não está no dicionário{"a": 1}["b"]
ZeroDivisionErrorDivisão por zero5 / 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")
Saída
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)
Saída
0

Os 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")
Saída
snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half left

Antes 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.

tracebackO relatório de erros do Python; leia de baixo para cima
SyntaxErrorCódigo inválido, encontrado antes de qualquer execução
NameErrorUm nome que não existe, muitas vezes um erro de digitação
TypeErrorUma operação com um valor do tipo errado
ValueErrorO tipo certo com um valor impossível, como int("abc")
erro de lógicaRoda sem mensagem, mas dá a resposta errada
try / exceptExecuta o bloco except em vez de parar quando esse erro acontece
  1. Qual linha de um traceback nomeia o tipo de erro?
    • A primeira linha
    • A linha File
    • A última linha
    • A linha com as marcas ^
  2. Que erro int("12a") causa?
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. Que erro pritn("hi") causa?
    • SyntaxError
    • NameError
    • TypeError
    • Nenhum erro
  4. 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
  5. O que isto mostra?
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. 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
  7. Um programa roda sem nenhuma mensagem, mas imprime o total errado. Que tipo de erro é esse?
    • SyntaxError
    • Erro de lógica
    • NameError
    • IndentationError
  8. O que isto mostra?
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. Coloque as linhas deste pequeno programa em ordem para ele imprimir o resultado abaixo.
    Saída
    80.0
  10. 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
Erros comuns
  • "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.
Nota do professorTorne as mensagens de erro comuns. Uma boa rotina: antes de corrigir qualquer coisa, o aluno lê a última linha em voz alta, diz o número da linha e aponta as marcas ^. Programas quebrados de propósito (um SyntaxError, um NameError, um TypeError) fazem um bom aquecimento. O currículo coreano de informática do ensino fundamental pede que os alunos analisem resultados com um depurador e corrijam erros; o IDLE tem um simples no menu Debug, mas linhas print e tabelas de rastreamento fazem o mesmo trabalho neste nível. O projeto do caderno de mesada combina com o padrão seguinte, resolver um problema da vida real com um programa, e pode ser adaptado para o orçamento do lanche da turma ou um diário de leitura.
Pontos-chave
  • 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