Skip to content
Back to Blog

Como ler um stack trace e corrigir o erro

Um stack trace parece ruído até você saber como lê-lo. Este guia decodifica traces em Python e JavaScript e mostra como encontrar a linha que realmente quebrou.

SZ
Founder, Molixa
12 min read
Compartilhar
Como ler um stack trace e corrigir o erro
Table of contents8 sections

Quando você cola um stack trace em uma caixa de busca e pensa "apenas me explique este stack trace de erro", na verdade está fazendo duas perguntas: o que quebrou e qual linha do meu código causou isso. Um stack trace responde ambas, mas apenas se você lê-lo na ordem certa. Este guia ensina a habilidade geral de decodificar qualquer trace, em Python ou JavaScript, para que você pare de chutar e comece a corrigir.

A maioria dos tutoriais responde a um erro específico e te deixa perdido no próximo. A habilidade que realmente se transfere é ler o próprio trace: saber onde está a causa real, quais frames ignorar e como transformar quarenta linhas de jargão em um diagnóstico de uma frase. Essa habilidade funciona em todos os erros que você encontrará.

O Que Realmente É um Stack Trace#

Um stack trace é um instantâneo da pilha de chamadas no exato momento em que seu programa travou. Ele lista todas as funções que estavam em execução, na ordem em que foram chamadas, além do tipo de erro e da mensagem no ponto da falha. Lendo-o corretamente, ele aponta diretamente para a linha problemática.

Pense nele como uma cadeia de "quem chamou quem." Seu programa entra em main, que chama processOrder, que chama chargeCard, que lança uma exceção. O trace registra toda essa cadeia para que você possa voltar do sintoma à causa.

Dois elementos são mais importantes:

  • O tipo de exceção e a mensagem: que tipo de falha ocorreu (um TypeError, um KeyError, uma referência nula) e uma breve descrição em linguagem humana.
  • Os frames: a lista ordenada de chamadas de função, cada uma com um nome de arquivo e número de linha.

Dica rápida: a mensagem de erro diz o que deu errado. Os frames dizem onde. Você quase sempre precisa de ambos para corrigir, e quem fica travado geralmente lê apenas um.

Como ler um stack trace de cima para baixo#

Aqui está a parte que confunde as pessoas: Python e JavaScript ordenam seus traces em direções opostas. Acertar a direção e todo o resto se encaixa.

Python: leia de baixo para cima#

Em Python, o trace é impresso com a chamada mais antiga primeiro e a mais recente por último. O cabeçalho diz Traceback (most recent call last), que é a instrução completa. A exceção real é a última linha, e a linha de código que a acionou está logo acima.

Traceback (most recent call last):
  File "app.py", line 42, in <module>
    main()
  File "app.py", line 30, in main
    total = calculate_total(cart)
  File "app.py", line 18, in calculate_total
    return sum(item["price"] for item in cart)
KeyError: 'price'

Comece pelo final. KeyError: 'price' significa que um dicionário não tinha a chave price. A linha diretamente acima mostra exatamente onde: linha 18, dentro de calculate_total, na expressão geradora. Tudo acima da linha 18 é apenas como o programa chegou lá. Você corrige a linha 18 (ou os dados que a alimentam), não o main.

JavaScript: leia de cima para baixo#

O JavaScript inverte. A mensagem de erro está na primeira linha, e o quadro mais acima é onde o erro foi lançado. Você lê para baixo apenas até onde precisa para chegar ao seu próprio código.

TypeError: Cannot read properties of undefined (reading 'name')
    at renderUser (app.js:24:18)
    at renderList (app.js:51:9)
    at App (app.js:78:5)
    at react-dom.production.min.js:118:188

A primeira linha é o diagnóstico: algo tentou ler .name em um valor que era undefined. O primeiro quadro, renderUser na linha 24, é onde aconteceu. Os quadros abaixo são os chamadores. O quadro inferior aqui está em react-dom, código de biblioteca que você não escreveu, então você o ignora.

Encontrando a Linha Que Realmente Quebrou#

O hábito mais útil é este: examine os frames e encontre o primeiro que aponte para seu arquivo, não para uma biblioteca ou o runtime. Esse frame é quase sempre onde você precisa olhar primeiro.

Um trace real é um sanduíche. O topo (JS) ou a base (Python) é a exceção bruta. O meio é uma mistura do seu código e do código do framework. O truque é filtrar:

  • Ignore frames do framework a menos que todos os frames sejam do framework (então você provavelmente está chamando uma API de forma errada).
  • Encontre seu primeiro frame: o frame JS mais acima ou o frame Python mais abaixo com o caminho do seu próprio arquivo e número de linha.
  • Abra essa linha e leia a mensagem de erro em relação ao que a linha está fazendo.

Combine a mensagem com a linha. KeyError: 'price' ao lado de item["price"] significa que a chave está faltando. Cannot read properties of undefined (reading 'name') ao lado de user.name significa que user é undefined. A mensagem nomeia a operação quebrada; a linha mostra onde você a escreveu.

Lendo a própria mensagem de erro#

A mensagem é uma frase comprimida. Decodifique as comuns e você terá decodificado a maioria das falhas que encontrará.

Fragmento da mensagem de erroO que significaPrimeira coisa a verificar
Cannot read properties of undefined (reading 'x')Você acessou .x em algo que era undefinedPor que o objeto está vazio ou ainda não foi carregado
KeyError: 'x' (Python)Um dicionário não tem a chave 'x'Ortografia, ou se a chave sempre existe
TypeError: 'NoneType' object is not subscriptableVocê indexou NoneO que retornou None em vez de uma lista/dicionário
IndexError: list index out of rangeVocê pediu um item além do final de uma listaLimites do loop, ou uma lista vazia
is not a function (JS)Você chamou algo que não é chamávelUm erro de digitação, ou um valor que não é o que você pensa
Maximum call stack size exceededRecursão infinitaUma função chamando a si mesma sem caso base

Um Fluxo de Trabalho Repetível para Depuração#

Depois que você aprender a ler um trace, incorpore-o a uma rotina para fazer as mesmas cinco coisas todas as vezes, em vez de entrar em pânico. Esse fluxo de trabalho é a diferença entre uma correção de cinco minutos e uma hora de frustração.

  1. Leia o tipo de exceção e a mensagem primeiro. Nomeie a falha em palavras simples antes de tocar em qualquer coisa.
  2. Encontre seu primeiro frame. No final em Python, no topo em JavaScript. Esse arquivo e número de linha é o ponto zero.
  3. Abra essa linha e forme uma hipótese. "Esta variável está indefinida aqui porque o fetch não foi resolvido." Uma frase.
  4. Verifique com um valor, não com um palpite. Imprima ou registre a variável suspeita logo antes da linha com falha. Confirme se é o que a mensagem alega.
  5. Corrija a causa, não o sintoma. Um guarda nulo esconde a falha, mas pergunte por que o valor era nulo. A correção real geralmente está um frame acima.

Esse último ponto é onde a maioria das pessoas erra. Envolver uma linha em um try/except ou em um encadeamento opcional ?. interrompe a falha sem corrigir nada. O trace lhe deu uma pista grátis: o valor estava errado upstream. Siga-a.

Aviso: nunca "corrija" um trace deletando a linha para a qual ele aponta ou capturando todas as exceções silenciosamente. Você não está removendo o bug, está se vendando para o próximo.

Quando os Trace Points Apenas Apontam para Código de Biblioteca#

Às vezes, cada frame está dentro de um framework ou dependência e nenhum aponta para o seu arquivo. Isso é desorientador, mas tem um significado claro: você passou dados inválidos para a biblioteca ou a chamou de forma errada. A biblioteca travou por sua causa.

Nesse caso, procure o frame mais profundo que toca o limite entre seu código e o deles. Um driver de banco de dados lançando erro em uma consulta malformada, um parser JSON lançando erro em uma string quebrada, um roteador lançando erro em uma definição de rota ruim. A correção está no valor ou na chamada que você passou, mesmo que a explosão visível esteja dentro do código deles.

Código assíncrono adiciona outra complicação. Promises, callbacks e threads podem produzir traces que "pulam" porque a falha aparece longe de onde a chamada original foi feita. Runtimes modernos adicionam frames assíncronos para ajudar, mas se um trace parecer impossivelmente curto ou desconectado, a origem real pode ser uma promise não aguardada ou um erro engolido em outro lugar.

Deixe um Explicador de Código Decifrar para Você#

Ler traces é uma habilidade e, como qualquer habilidade, é lenta até se tornar rápida. Quando você está encarando um erro desconhecido em uma linguagem que raramente usa, colar tudo em uma ferramenta que explica em português claro economiza tempo real. Nosso explicador de código gratuito pega um traceback bruto e retorna o tipo de erro, a causa provável e a linha para olhar, em modos iniciante a sênior.

A ressalva honesta: uma explicação de IA é uma hipótese forte, não um veredito. Ela pode interpretar mal uma pilha incomum ou inventar uma causa que parece plausível. Trate a resposta como trataria um colega sênior olhando para sua tela, um direcionamento rápido para o caminho certo que você ainda confirma na linha e valor reais.

Dois hábitos rápidos de verificação mantêm você seguro:

  • Confira o número da linha. Se a ferramenta disser que o bug está na linha 18, abra a linha 18 e confirme se a mensagem corresponde ao que esse código faz.
  • Cuidado com APIs inventadas. Se uma correção sugerida referenciar um método ou pacote que você não reconhece, pesquise antes de confiar. Nomes de funções alucinados são a forma mais comum de essas ferramentas enganarem.

Para erros que são realmente problemas de padrão, como uma regex que lança exceção ou falha ao corresponder, combine a explicação com um testador de regex ao vivo para depurar seu padrão para ver exatamente quais caracteres correspondem. E se o explicador entregar um payload JSON confuso enterrado no erro, execute-o no formatador de JSON para tornar a estrutura legível antes de continuar lendo o trace.

Juntando Tudo#

Na próxima vez que precisar explicar esse stack trace de erro, você terá um processo em vez de pânico. Nomeie a exceção, leia na direção correta (de baixo para cima no Python, de cima para baixo no JavaScript), encontre o primeiro frame no seu próprio código e confirme sua hipótese com um valor real antes de alterar qualquer coisa. O trace não é ruído. É um mapa com o destino já marcado.

Ler traces fluentemente é o que separa desenvolvedores que corrigem bugs em minutos daqueles que perdem tardes inteiras. Crie o hábito com erros pequenos agora, e os assustadores traces de quarenta linhas deixarão de ser assustadores.

Perguntas Frequentes#

Leio um stack trace de cima para baixo ou de baixo para cima? Depende da linguagem. Python imprime a chamada mais antiga primeiro e a exceção por último, então você lê de baixo para cima e a linha com falha fica logo acima da mensagem de erro final. JavaScript coloca a mensagem de erro e o quadro que lançou a exceção no topo, então você lê de cima para baixo. Em ambos os casos, você está procurando o primeiro quadro que aponta para seu próprio código.

O que "Cannot read properties of undefined" realmente significa? Significa que seu código tentou acessar uma propriedade ou método em um valor que era undefined. Por exemplo, user.name quando user nunca foi atribuído. A correção raramente está nessa linha em si; é descobrir por que o valor estava vazio, o que geralmente é um carregamento de dados que não foi concluído ou um objeto que nunca foi retornado.

Qual linha no trace é a que devo corrigir? Encontre o primeiro quadro que referencia um arquivo que você escreveu, não uma biblioteca ou o runtime. Essa linha é onde o erro se manifestou. A causa real às vezes está um quadro acima, onde um valor errado foi passado, então leia a mensagem junto com a linha e siga os dados para trás se a linha em si parecer inocente.

Posso confiar em uma ferramenta de IA para explicar meu stack trace? Na maioria das vezes, como uma primeira leitura rápida. Um bom explicador de código nomeará corretamente o tipo de erro e apontará para a área certa muito mais rápido do que pesquisar em fóruns. Trate a correção específica como uma hipótese: confirme se o número da linha corresponde ao código com falha e nunca cole um método ou pacote sugerido que você não possa verificar se existe.

Por que meu trace mostra apenas código de biblioteca e nenhum dos meus arquivos? Isso geralmente significa que você passou uma entrada inválida para uma biblioteca ou chamou sua API incorretamente, então a falha ocorre dentro do código deles em seu nome. Olhe para o quadro de fronteira onde sua chamada entra na biblioteca e verifique os valores ou argumentos que você forneceu. A correção está na sua entrada, mesmo que a explosão esteja no código deles.

O que devo fazer com um stack trace assíncrono ou de Promise que parece desconectado? Erros assíncronos podem surgir longe de onde a chamada original foi feita, então o trace pode parecer curto ou pular inesperadamente. Procure por uma promise não aguardada ou um erro engolido upstream, ative stack traces assíncronos se seu runtime suportar e adicione um log logo antes do await suspeito para confirmar qual valor você realmente tem naquele ponto.

More from Molixa

Try Molixa Tools

50+ free AI tools for content creation, SEO, coding, and more. No signup, no watermark.

Explore all tools