Обработка ошибок

При работе с API важно корректно обрабатывать все возможные ошибки. Функция fetch ведёт себя особым образом: она выбрасывает исключение только при сетевых сбоях (например, отсутствии интернета или недоступности сервера), но не считает ошибкой HTTP-статусы 4xx или 5xx. Это означает, что даже ответ с кодом 404 или 500 будет успешно разрешён как промис, и программист обязан проверить статус вручную.

Основные типы ошибок

  1. Ошибка сети — запрос не дошёл до сервера (нет подключения, DNS не разрешился и т.п.).
  2. Ошибка сервера — запрос дошёл, но сервер вернул статус 4xx/5xx.
  3. Ошибка парсинга — сервер вернул данные в неожиданном формате (например, HTML вместо JSON).

Все три случая требуют отдельной обработки.

Пример полной обработки

async function fetchUser(id: number): Promise<User> {
  try {
    const response = await fetch(`/api/user/${id}`);

    // Проверка HTTP-статуса
    if (!response.ok) {
      throw new Error(`Server returned ${response.status}: ${response.statusText}`);
    }

    // Попытка распарсить JSON
    const rawData: unknown = await response.json();

    // Проверка структуры (упрощённо)
    if (
      typeof rawData === 'object' &&
      rawData !== null &&
      'id' in rawData &&
      'name' in rawData
    ) {
      return rawData as User;
    } else {
      throw new Error('Invalid data structure');
    }
  } catch (error) {
    // Обработка сетевой ошибки или ошибки парсинга
    if (error instanceof Error) {
      console.error('Fetch error:', error.message);
      throw error; // или обработать по-другому (показать уведомление и т.п.)
    }
    throw new Error('Unknown error occurred');
  }
}

Ключевые моменты

  • Всегда проверяйте response.ok после fetch, если ожидаете успешный результат.
  • Оборачивайте вызов response.json() в try/catch, так как он выбросит ошибку, если тело ответа не является валидным JSON.
  • Используйте внешний catch для перехвата сетевых ошибок (например, TypeError: Failed to fetch).
  • Не полагайтесь на то, что сервер всегда вернёт ожидаемый формат — даже при статусе 200.

Такой подход обеспечивает устойчивость приложения к реальным условиям работы: потере соединения, изменениям в API или временным сбоям сервера.