Sobes.tech
Junior

Como é que lidas com a situação em que uma promessa termina com erro (rejeição)?

sobes.tech IA

Resposta da IA

Estou a tratar usando os métodos .catch() ou .finally().

.catch() é usado para tratar promessas rejeitadas. Se a promessa for resolvida com sucesso, o bloco .catch() é ignorado.

// Tratamento de erro com .catch()
fetch('/api/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('Request failed'); // Simulação de erro
    }
    return response.json();
  })
  .then(data => {
    console.log('Dados recebidos:', data);
  })
  .catch(error => {
    console.error('Erro:', error); // Tratamento de erro aqui
  });

.finally() é executado independentemente de a promessa ser concluída com sucesso (fulfill) ou com erro (reject). É útil para limpar recursos ou esconder indicadores de carregamento.

// Uso de .finally() para executar código após a conclusão da promessa
fetch('/api/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('Request failed');
    }
    return response.json();
  })
  .then(data => {
    console.log('Dados recebidos:', data);
  })
  .catch(error => {
    console.error('Erro:', error);
  })
  .finally(() => {
    console.log('Requisição terminada.'); // Este código sempre será executado
  });

Posso também usar a construção try...catch dentro de funções async para tratar erros de operações assíncronas, incluindo promessas:

// Tratamento de erro em async/await usando try...catch
async function fetchData() {
  try {
    const response = await fetch('/api/data');
    if (!response.ok) {
      throw new Error('Request failed');
    }
    const data = await response.json();
    console.log('Dados recebidos:', data);
  } catch (error) {
    console.error('Erro:', error); // Tratamento de erro aqui
  } finally {
    console.log('Operação de fetch concluída.'); // Sempre executado
  }
}

fetchData();

A escolha do método depende do contexto e da lógica de tratamento requerida. .catch() é a estrutura principal para reagir a erros, e .finally() para ações que são executadas independentemente do resultado. try...catch em funções async fornece um estilo de tratamento de erros mais familiar e síncrono.