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

alternativa ao método para lidar com o erro

já que o fetch retorna uma promise, não seria menos verboso lidar com o erro usando o 'catch' no próprio fetch?

return fetch(url)
      .then(response => response.json())
      .catch(error => throw new Error(error);

existe algum motivo para isso não funcionar no fetch?

2 respostas
solução!

Boa tarde Victor! O catch continua sendo usado por quem chamou a API! Mas há um detalhe.

Se a sua API Fetch receber um 404, 500 ou qualquer outro código de erro ela não lançará um erro automaticamente não cairá no catch. É por isso que uma das primeiras coisas que você precisa fazer é testar res.ok para saber se houve algum problema. Esse res.ok é um atalho que evita uma série de if's para a faixa de status HTTP de erros. Se res.ok for falso, significa que houve algum problema na requisição e você precisa lançar um erro para que a instrução catch seja processada.

É a mesma questão quando trabalharmos com XHMLHttpRequest...

Na explicação textual eu digo:

No entanto, faltou tratar os casos de erro na nossa Fetch API. Como o código identificava se tínhamos um erro? Testávamos com o readyState se a requisição estava completa e verificávamos se o estado era 200 ou com um valor próximo. Neste caso, nós usaremos o res.ok para fazermos testes com o status e nos indicará se é falso ou verdadeiro. Vamos ver como tratar o erro.

Por isso a necessidade do handler:

_handleErrors(res) {
    if(!res.ok) throw new Error(res.statusText);
    return res;
}

O Design da API fetch é assim porque nem sempre você quer tratar um erro vindo de um servidor como um erro, pode querer se recuperar por vias normais (dentro do then) e não dentro do catch.

Entendido professor, bastante esclarecedor. Obrigado.