Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] Tratamento de erros sem try / catch

Boa tarde,

Apenas para sugestão; seria possível também não utilizar excessivamente o try / catch em cada método da Controller, para isso seria necessário adotar o uso do lançamento de exceção, exemplo: throw new NaoEncontrado('Id do Autor não localizado) e remover a chamada à função next() de cada método. Porém, teria que ser feito algumas outras modificações no código. Caso achar interessante exemplificar uma forma de tratamento de erros, sem a necessidade de try / catch.

Obrigado.

Atenciosamente

Felipe D.R

2 respostas
solução!

Oi, Felipe, tudo bem?

A sua sugestão é muito boa, mas infelizmente a versão 4 do Express (a utilizada no curso) possui uma limitação quando utilizamos funções assíncronas, que é justamente não serem capazes de capturar erros que são lançados com a palavra-chave throw. Como os métodos dos controladores são assíncronos, nós somos obrigados a utilizar a função next, além de tratar os erros de alguma forma que vai acabar sendo repetitiva para cada método, e no curso é feito o uso do try/catch.

A página Error handling da documentação do Express fala sobre isso, e também algumas formas alternativas de lidar com erros dentro de funções assíncronas, mas acabaria havendo repetição de código independente do método.

Essa mesma página também fala que a versão 5 do Express já lida melhor com o tratamento de erros assíncronos. No momento que escrevo esse post, a versão 5 do Express ainda não foi lançada oficialmente, mas já possui versões experimentais que você pode conferir no Github.

Na versão 5, qualquer erro lançado dentro de um middleware assíncrono automaticamente executa a função next. Considere o método listarLivros:

  static listarLivros = async (req, res, next) => {
    try {
      const livrosResultado = await livros.find().populate("autor");

      res.status(200).json(livrosResultado);
    } catch (erro) {
      next(erro);
    }
  };

Na versão 4 do Express, se você remover o bloco try/catch e um erro for lançado pelo método find, o servidor será derrubado. Porém, na versão 5 do Express, esse método poderá ser refatorado para o seguinte:

  static listarLivros = async (req, res) => {
    const livrosResultado = await livros.find().populate("autor");

    res.status(200).json(livrosResultado);
  };

Bem melhor, não é? Não haverá mais necessidade de utilizar o try/catch e nem de chamar o método next manualmente e, ainda assim, o middleware de erros será chamado automaticamente pelo Express, sem derrubar o servidor. Vamos esperar pelo lançamento oficial dessa versão!

Espero ter ajudado! Abraços e bons estudos :)

Boa tarde, tudo jóia Antônio,

Excelente, muito obrigado pelas informações e detalhamento, parabéns!

Obrigado

Felipe D.R