Pular para o conteúdo principal

Causas de erros

· Leitura de 2 minutos
Victor Gomes ([@VictorBFG](https://twitter.com/VictorBFG))

Imagine que você tem uma função que chama dois processos de trabalho separados doSomeWork e doMoreWork. Ambas as funções podem lançar o mesmo tipo de erros, mas você precisa tratá-los de maneiras diferentes.

Capturar o erro e lançá-lo novamente com informações contextuais adicionais é uma abordagem comum para esse problema, por exemplo:

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new CustomError('Falha em algum trabalho', err);
}
doMoreWork();
}

try {
doWork();
} catch (err) {
// O |err| vem de |doSomeWork| ou de |doMoreWork|?
}

Infelizmente, a solução acima é trabalhosa, já que é necessário criar seu próprio CustomError. E, pior ainda, nenhuma ferramenta de desenvolvimento é capaz de fornecer mensagens de diagnóstico úteis para exceções inesperadas, pois não há consenso sobre como representar adequadamente esses erros.

O que tem faltado até agora é uma maneira padrão de encadear erros. O JavaScript agora suporta causas de erros. Um parâmetro de opções adicional pode ser adicionado ao construtor Error com uma propriedade cause, cujo valor será atribuído às instâncias de erro. Os erros podem, então, ser facilmente encadeados.

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new Error('Falha em algum trabalho', { cause: err });
}
try {
doMoreWork();
} catch (err) {
throw new Error('Falha em mais trabalho', { cause: err });
}
}

try {
doWork();
} catch (err) {
switch(err.message) {
case 'Falha em algum trabalho':
handleSomeWorkFailure(err.cause);
break;
case 'Falha em mais trabalho':
handleMoreWorkFailure(err.cause);
break;
}
}

Esse recurso está disponível no V8 v9.3.

Suporte para causas de erros