JavaScript: Erros e Depuração em JavaScript
Última atualização: 2026-10-13
Escrever código sem bugs é impossível — até o criador do JavaScript produziu o bug typeof null === "object" em apenas 10 dias. Então aprender a encontrar bugs e tratar erros é até mais importante do que aprender a escrever código.
1. Tratamento de Erros e Depuração
| Tipo de Erro | Causa | Exemplo |
|---|---|---|
SyntaxError |
Sintaxe inválida | if (true { — parênteses desbalanceados |
ReferenceError |
Acessar variável inexistente | console.log(naoExiste) |
TypeError |
Operar sobre tipo errado | undefined.toString() |
RangeError |
Valor fora da faixa válida | new Array(-1) |
SyntaxError é capturado antes da execução do código (fase de parsing). Os outros três são erros de execução.
(2) try...catch...finally
Use try...catch para capturar erros de execução e impedir que seu programa trave:
<script>
try {
const dados = JSON.parse('{json invalido}');
} catch (erro) {
console.log("Falha no parsing:", erro.message);
} finally {
console.log("Trabalho de limpeza");
}
</script>
O objeto erro no catch tem duas propriedades comumente usadas:
erro.message— uma descrição do erroerro.name— o nome do tipo de erro
(3) throw — Lançando Erros Manualmente
try...catch só pode capturar erros de execução, mas erros de lógica de negócio precisam ser lançados manualmente:
<script>
function definirIdade(idade) {
if (typeof idade !== "number" || idade < 0) {
throw new Error("Idade deve ser um número positivo");
}
console.log("Idade definida como: " + idade);
}
try {
definirIdade(-5);
} catch (e) {
console.log(e.message);
}
</script>
throw pode lançar qualquer valor, mas usar new Error() ou suas subclasses é recomendado — elas incluem informações de stack trace.
(4) Mensagens de Erro Personalizadas
Use subclasses de Error ou propriedades personalizadas para fornecer informações de erro mais ricas:
<script>
class ErroValidacao extends Error {
constructor(campo, mensagem) {
super(mensagem);
this.name = "ErroValidacao";
this.campo = campo;
}
}
try {
throw new ErroValidacao("email", "Formato de email inválido");
} catch (e) {
console.log(e.name + " [" + e.campo + "]: " + e.message);
}
</script>
(5) DevTools do Navegador (F12)
| Painel | Finalidade |
|---|---|
| Console | Ver logs, executar código, ver erros |
| Sources | Definir breakpoints, percorrer código, inspecionar variáveis |
| Network | Inspecionar requisições de rede, status de resposta, tempos de carregamento |
| Elements | Ver/modificar DOM e estilos |
Depuração com breakpoints é a técnica de depuração mais poderosa: clique em um número de linha no painel Sources para definir um breakpoint, atualize a página, e o código pausa naquele ponto — percorra linha por linha, inspecione variáveis e examine a pilha de chamadas.
(6) A Família console
| Método | Finalidade |
|---|---|
console.log() |
Saída geral |
console.warn() |
Aviso (amarelo) |
console.error() |
Erro (vermelho) |
console.table() |
Exibir arrays/objetos como tabela |
console.time() / console.timeEnd() |
Cronometragem |
console.group() / console.groupEnd() |
Saída agrupada |
console.clear() |
Limpar o console |
console.table é especialmente útil para exibir arrays de objetos — muito mais legível que log.
(7) Dicas de Depuração
- Comente metades: Comente metade do código, veja qual metade tem o problema, e vá reduzindo passo a passo
- console.log em todo lugar: Imprima valores de variáveis em pontos-chave — primitivo, mas eficaz
- Depuração com breakpoints: Mais poderoso que
console.log— pause a execução e modifique variáveis em tempo real - Depuração com pato de borracha: Explique seu código linha por linha para um pato de borracha (ou colega). Frequentemente, você encontra o bug no meio da explicação.
▶ Exemplo: try/catch para Parsing de JSON
▶ Experimente▶ Exemplo: Erros Personalizados e Validação de Formulário
▶ Experimente▶ Exemplo: Referência Rápida de Tipos de Erro e Métodos de Console
▶ Experimente❓ Perguntas Frequentes
SyntaxError é lançado durante a fase de parsing, antes mesmo da execução começar, então o bloco try nunca é alcançado. Porém, se um SyntaxError ocorrer em tempo de execução (ex: JSON.parse falha, ou new Function("sintaxe errada")), ele pode ser capturado.catch é suficiente.return é para fluxo normal — quem chama trata o valor retornado. throw é para fluxo anormal — ele pula o código subsequente e sobe na pilha de chamadas procurando um catch. Use throw para erros, return para resultados normais.📖 Resumo
try/catchcaptura erros em tempo de execução;finallysempre executa, perfeito para limpezathrowlevanta erros manualmente — prefirathrow new Error("mensagem")- Objetos Error têm propriedades
nameemessage; o console mostra o stack trace completo - DevTools (F12): Painel Sources para breakpoints, Watch para variáveis, execução passo a passo
- Métodos do console:
log/warn/error/table/group/time/timeEndaumentam a eficiência de depuração
📝 Exercícios
- Escreva uma função
divisaoSegura(a, b)que use try...catch para tratar divisão por zero (dica: dividir por zero em JS não lança erro — você precisa verificar e lançar você mesmo). Retorne o resultado ou uma mensagem de erro. - Escreva uma função
parseJSONSeguro(str)que faça parsing de uma string JSON. Em caso de falha, retorne{ sucesso: false, erro: <mensagem de erro> }. Em caso de sucesso, retorne{ sucesso: true, dados: <resultado do parsing> }. - Escreva uma função
tentarNovamente(fn, vezes): executefn, e se lançar erro, tente novamente atévezesvezes. Se todas as tentativas falharem, lance o último erro. Implemente com try...catch.