Desafio JavaScript

Encadeamento de erros com cause

Enunciado

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.

Requisitos

  • A função lerConfiguracao deve usar try/catch internamente para capturar o erro do JSON.parse.
  • Deve lançar um novo Error com cause igual ao erro original.
  • O catch externo deve imprimir 'Erro: Falha ao ler configuração' e 'Causa: <mensagem do erro original>'.
  • O programa deve ser executável e não lançar exceção não capturada.

Código inicial

function lerConfiguracao(jsonString) {
  // seu código aqui
}

try {
  // chame lerConfiguracao com uma string inválida
} catch (erro) {
  // exiba mensagem e cause
}

Saída esperada

Erro: Falha ao ler configuração
Causa: Unexpected token 'i', "{ inválido }" is not valid JSON
Ver dica

Use new Error('mensagem', { cause: erroOriginal }) e acesse erro.cause.message no catch externo.

Mostrar solução
function lerConfiguracao(jsonString) {
  try {
    return JSON.parse(jsonString);
  } catch (erro) {
    // Lança um novo erro com a causa original
    throw new Error('Falha ao ler configuração', { cause: erro });
  }
}

try {
  const config = lerConfiguracao('{ inválido }');
  console.log('Configuração:', config);
} catch (erro) {
  console.log('Erro:', erro.message);
  console.log('Causa:', erro.cause.message);
}

Passo a passo

  1. A função lerConfiguracao recebe uma string JSON.
  2. Dentro de um try, tenta converter a string em objeto com JSON.parse.
  3. Se a conversão falhar, o catch interno captura o erro original.
  4. Lançamos um novo Error com uma mensagem mais amigável e a opção { cause: erro }.
  5. No try externo, chamamos lerConfiguracao com uma string inválida.
  6. O erro lançado é capturado pelo catch externo.
  7. Exibimos a mensagem do novo erro e acessamos erro.cause.message para mostrar a causa raiz.

Por que funciona

O encadeamento de erros com cause permite adicionar contexto sem perder o erro original. Isso é útil para depuração, pois mantém a trilha do que realmente aconteceu. O try/catch interno isola a falha do JSON.parse e a transforma em um erro de domínio.

Erros comuns

  • Esquecer de passar { cause: erro }: a causa raiz é perdida.
  • Acessar erro.cause sem verificar se existe: se não houver causa, erro.cause é undefined e .message lançará erro.
  • Lançar o mesmo erro em vez de criar um novo: perde-se a oportunidade de adicionar contexto.

Outra forma de resolver

Poderia usar uma subclasse ConfigError em vez de Error genérico, mas o enunciado pede Error com cause.

Saída esperada

Erro: Falha ao ler configuração
Causa: Unexpected token 'i', "{ inválido }" is not valid JSON