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
lerConfiguracaodeve usartry/catchinternamente para capturar o erro doJSON.parse. - Deve lançar um novo
Errorcomcauseigual ao erro original. - O
catchexterno 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
- A função
lerConfiguracaorecebe uma string JSON. - Dentro de um
try, tenta converter a string em objeto comJSON.parse. - Se a conversão falhar, o
catchinterno captura o erro original. - Lançamos um novo
Errorcom uma mensagem mais amigável e a opção{ cause: erro }. - No
tryexterno, chamamoslerConfiguracaocom uma string inválida. - O erro lançado é capturado pelo
catchexterno. - Exibimos a mensagem do novo erro e acessamos
erro.cause.messagepara 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.causesem verificar se existe: se não houver causa,erro.causeéundefinede.messagelanç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