Como usar error cause no Javascript e no Typescript

laracarvalho

Lara Carvalho

Posted on March 8, 2023

Como usar error cause no Javascript e no Typescript

Tratar erros nunca é uma tarefa divertida, principalmente no ecossistema Javascript onde precisamos tratar vários tipos de erros; HTTP, Node, milhares de bibliotecas...

Uma proposta relativamente recente me chamou bastante à atenção em relação ao tratamento de erros. Se trata da proposal-error-cause, já disponível nas versões mais atualizadas dos navegadores e do Node 16.9.0. De forma resumida, ela traz a razão, a causalidade de um erro específico.

Sabe quando precisamos fazer um fetch em uma API e precisamos tratar diversos erros como a própria falha da rota, bug em nossa implementação ou até mesmo um erro terceiro, que não previmos ainda? É uma loucura tratar isso tudo da forma tradicional, mas usando um exemplo descrito na própria proposta, podemos ver como esse tal error.cause pode nos ajudar:

async function doJob() {
  const rawResource = await fetch('//domain/resource-a')
    .catch(err => {
      throw new Error('Download raw resource failed', { cause: err })
    })

  const jobResult = doComputationalHeavyJob(rawResource)
  await fetch('//domain/upload', { method: 'POST', body: jobResult })
    .catch(err => {
      throw new Error('Upload job result failed', { cause: err })
    })
}

try {
  await doJob()
} catch (e) {
  console.log(e)
  console.log('Caused by', e.cause)
}
// Error: Upload job result failed
// Caused by TypeError: Failed to fetch
Enter fullscreen mode Exit fullscreen mode

Além dos nossos logs tratados, recebemos exatamente a causa daquele erro estar sendo levantado. Isso resolve aquele problema de tentar encapsular erros em mensagens bonitinhas e acabar tirando um pouco da transparência que facilita um bom debugging.

Agora, tudo parece muito fácil, certo? Só começar a aplicar isso ao seu código e ser feliz. Na verdade, ainda não temos uma implementação dessa propriedade no Typescript até o momento (02/2023).

Se você tentar acessar a propriedade, receberá um erro dizendo que tal propriedade não existe na classe Error.

Isso porque o Typescript trabalha em cima de versões novas do ES e Node. Como essa proposta foi aprovada e adicionada à versão 16.9.0 do Node, e o time do Typescript adicionou essa mudança algum tempo depois, precisamos atualizar nosso tsconfig.

Veja o exemplo abaixo:

{
  "compilerOptions": {
    "lib": ["es2022"],
    ...
  },
Enter fullscreen mode Exit fullscreen mode

Atualizando o compilerOptions.lib para ES2022, os erros em relação ao error.cause irão desaparecer e você irá poder usurfruir dessa ferramenta poderosíssima.

Para referência, a compatibilidade da proposta:

  • Chrome, released on 93,
  • Firefox, released on 91,
  • Safari, released on 15,
  • Node.js, released on v16.9.0.
💖 💪 🙅 🚩
laracarvalho
Lara Carvalho

Posted on March 8, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related