Da trilha de JavaScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

JavaScript Erros Intermediário

Tratamento de erros

Em JavaScript, erros podem ser lançados (throw) e capturados (try/catch) para evitar que o programa quebre inesperadamente. O bloco finally executa sempre, independentemente de ter ocorrido erro ou não, sendo útil para liberar recursos.

A classe base Error representa erros genéricos, mas podemos criar subclasses personalizadas para representar situações específicas do domínio da aplicação. Isso melhora a legibilidade e permite tratar cada tipo de erro de forma distinta.

Desde o ES2022, o construtor Error aceita a opção cause, que permite encadear erros e preservar a causa raiz. Isso é valioso para depuração, pois mantém o contexto do erro original.

Pontos-chave

  • try delimita o código que pode lançar exceções; catch captura o erro; finally sempre executa.
  • throw interrompe o fluxo e lança um valor (geralmente um objeto Error).
  • Prefira estender Error para criar erros específicos, como ValidationError.
  • Use new Error('msg', { cause: erroOriginal }) para encadear erros e preservar a causa.
  • Sempre capture erros que você pode tratar; deixe os inesperados subirem.
tratamento_erros.js
// Exemplo completo de tratamento de erros em JavaScript

// Definindo uma subclasse de Error para validação
class ValidationError extends Error {
  constructor(message, options) {
    super(message, options);
    this.name = 'ValidationError';
  }
}

// Função que valida a idade e lança erro se inválida
function validarIdade(idade) {
  if (typeof idade !== 'number' || idade < 0) {
    throw new ValidationError('Idade deve ser um número não negativo', { cause: idade });
  }
  return idade;
}

// Simulando um fluxo com try/catch/finally
try {
  console.log('Iniciando validação...');
  const idade = validarIdade(-5); // Isso lançará um erro
  console.log('Idade válida:', idade);
} catch (erro) {
  // Tratando o erro específico
  if (erro instanceof ValidationError) {
    console.error('Erro de validação:', erro.message);
    console.error('Causa:', erro.cause);
  } else {
    console.error('Erro inesperado:', erro);
  }
} finally {
  console.log('Validação finalizada.');
}

// Exemplo de encadeamento de erros
function processarDados(dados) {
  try {
    return JSON.parse(dados);
  } catch (erro) {
    throw new Error('Falha ao processar dados', { cause: erro });
  }
}

try {
  processarDados('{ inválido }');
} catch (erro) {
  console.error('Erro:', erro.message);
  console.error('Causa raiz:', erro.cause.message);
}

Exercícios

  1. 1
    Fácil

    Capturando erro de divisão por zero

    Crie uma função dividir(a, b) que lança um Error se b for zero. Use try/catch para capturar e exibir a mensagem de erro.

    Resolver
  2. 2
    Médio

    Erro personalizado com finally

    Crie uma classe SaldoInsuficienteError que estende Error. Implemente uma função sacar(saldo, valor) que lança esse erro se valor > saldo. Use try/catch/finally para exibir mensagens e garantir que uma mensagem de finalização sempre apareça.

    Resolver
  3. 3
    Desafio

    Encadeamento de erros com cause

    Crie uma função lerConfiguracao(jsonString) que tenta fazer JSON.parse e, se falhar, lança um novo Error com a mensagem 'Falha ao ler configuração' e a propriedade cause contendo o erro original. No catch externo, exiba a mensagem e a causa raiz.

    Resolver

Continue estudando