Обработка ошибок
При работе с API важно корректно обрабатывать все возможные ошибки. Функция fetch ведёт себя особым образом: она выбрасывает исключение только при сетевых сбоях (например, отсутствии интернета или недоступности сервера), но не считает ошибкой HTTP-статусы 4xx или 5xx. Это означает, что даже ответ с кодом 404 или 500 будет успешно разрешён как промис, и программист обязан проверить статус вручную.
Основные типы ошибок
- Ошибка сети — запрос не дошёл до сервера (нет подключения, DNS не разрешился и т.п.).
- Ошибка сервера — запрос дошёл, но сервер вернул статус 4xx/5xx.
- Ошибка парсинга — сервер вернул данные в неожиданном формате (например, 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 или временным сбоям сервера.