← Назад к вопросам
Как обработать в промисе состояние rejected?
2.3 Middle🔥 131 комментариев
#Теория тестирования
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Обработка состояния Rejected в Promise
Для обработки состояния rejected в промисах существуют несколько основных подходов. Вот наиболее распространенные и эффективные способы:
1. Метод .catch()
Этот метод принимает функцию-обработчик, которая выполняется при отклонении промиса.
fetchData()
.then(data => {
console.log('Успех:', data);
})
.catch(error => {
console.error('Ошибка:', error.message);
// Можно вернуть значение по умолчанию
return { default: 'data' };
})
.then(result => {
// Обрабатываем результат (даже после catch)
console.log('Финальный результат:', result);
});
2. Второй аргумент в .then()
Метод .then() принимает два аргумента: для обработки успеха и для обработки ошибки.
fetchData()
.then(
data => {
console.log('Успех:', data);
},
error => {
console.error('Ошибка в then:', error);
// Важно: эта обработка не перехватит ошибки из success-обработчика выше
}
);
3. Комбинация try/catch с async/await
Для асинхронных функций наиболее читаемым вариантом является использование try/catch.
async function processData() {
try {
const data = await fetchData();
console.log('Успех:', data);
return data;
} catch (error) {
console.error('Ошибка:', error);
// Возвращаем значение по умолчанию
return { error: 'handled', originalError: error.message };
} finally {
console.log('Операция завершена (успешно или с ошибкой)');
}
}
4. Глобальная обработка неперехваченных ошибок
Для отлова неперехваченных отклонений промисов используйте глобальные обработчики:
// Для неперехваченных promise rejections
window.addEventListener('unhandledrejection', event => {
console.error('Неперехваченный rejection:', event.reason);
// Можно отправить в систему мониторинга
sendToErrorMonitoring(event.reason);
// Предотвращаем вывод в консоль браузера
event.preventDefault();
});
// Для уже перехваченных, но позже
window.addEventListener('rejectionhandled', event => {
console.log('Rejection был обработан позже:', event.reason);
});
Ключевые различия и рекомендации
Важные нюансы:
- Цепочка промисов: Обработчик
.catch()перехватывает ошибки из всех предыдущих.then()в цепочке - Возврат значений: Из
.catch()можно вернуть значение, которое попадет в следующий.then() - Проброс ошибок: Если нужно пробросить ошибку дальше, можно выбросить ее снова:
fetchData()
.catch(error => {
if (error.type === 'network') {
// Обрабатываем сетевые ошибки
return retryFetch();
}
// Пробрасываем другие ошибки дальше
throw error;
})
.catch(error => {
// Сюда попадут только неперехванные ошибки
console.error('Критическая ошибка:', error);
});
Паттерны обработки:
- Централизованная обработка: Создайте функцию-обертку для единообразной обработки ошибок
- Типизация ошибок: Используйте кастомные классы ошибок для лучшего управления:
class ApiError extends Error {
constructor(message, statusCode) {
super(message);
this.name = 'ApiError';
this.statusCode = statusCode;
}
}
async function fetchWithHandling() {
try {
const response = await fetch('/api/data');
if (!response.ok) {
throw new ApiError('Ошибка API', response.status);
}
return await response.json();
} catch (error) {
if (error instanceof ApiError) {
// Специфичная обработка API ошибок
handleApiError(error);
} else {
// Обработка других ошибок
handleGenericError(error);
}
}
}
Лучшие практики:
- Всегда обрабатывайте возможные отклонения промисов
- Используйте
async/awaitсtry/catchдля улучшения читаемости кода - Не забывайте про блок
finallyдля cleanup-операций
- Избегайте "забытых" промисов без обработки ошибок
- Логируйте ошибки для последующего анализа
- Предусматривайте fallback-значения для критически важных операций
Правильная обработка состояний rejected делает код более устойчивым к ошибкам и улучшает пользовательский опыт, позволяя корректно реагировать на различные сбои в работе приложения.