Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как обрабатывать ошибки fetch

Короткий ответ

Ошибки бывают двух видов: сбой сети, и тогда fetch() выбрасывает исключение, или сервер отвечает статусом ошибки. Обработайте оба:

try {
  const response = await fetch('/api/profile');
  if (!response.ok) {
    throw new Error(`Server error: ${response.status}`);
  }
  const profile = await response.json();
  showProfile(profile);
} catch (error) {
  showMessage('Could not load the profile: ' + error.message);
}

Вспомогательная функция

Соберите проверки в одной функции и используйте её везде:

async function getJson(url, options) {
  const response = await fetch(url, options);
  if (!response.ok) {
    const text = await response.text();
    throw new Error(`${response.status} ${response.statusText}: ${text.slice(0, 100)}`);
  }
  return response.json();
}
 
const orders = await getJson('/api/orders');

Разные статусы

Иногда реакция зависит от статуса: 401 — нужно войти, 404 — ничего не найдено:

const response = await fetch('/api/orders/15');
 
if (response.status === 401) {
  location.href = '/login';
} else if (response.status === 404) {
  showMessage('Order not found');
} else if (response.ok) {
  showOrder(await response.json());
}

Частая ошибка

Без await внутри try ошибка случится позже, вне блока, и catch её не поймает:

try {
  fetch('/api/profile').then((response) => response.json());
} catch (error) {
  // never runs for request errors
}

Функции из этого ответа

  • fetch — Отправляет HTTP-запрос и возвращает промис ответа.
  • try...catch — Перехватывает ошибки, чтобы программа не остановилась.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.