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.

Métodos BOM relacionados:console.error() console.table() console.log() try...catch JSON.parse finally return Error catch

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:

HTML
<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:

(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:

HTML
<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:

HTML
<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


▶ 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

Métodos BOM relacionados:console.error() console.table() console.log() try...catch JSON.parse finally return Error catch

❓ Perguntas Frequentes

P O try...catch pode capturar SyntaxError?
R Não. 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.
P Quando devo usar finally?
R Quando você precisa que operações de limpeza executem independentemente de ter ocorrido um erro — fechar arquivos, liberar recursos, esconder estados de carregamento. Para a maioria dos cenários simples, apenas catch é suficiente.
P Qual a diferença entre throw e return?
R 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


📝 Exercícios

  1. 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.
  2. 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> }.
  3. Escreva uma função tentarNovamente(fn, vezes): execute fn, e se lançar erro, tente novamente até vezes vezes. Se todas as tentativas falharem, lance o último erro. Implemente com try...catch.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%