Вопрос проверяет понимание обработки ошибок в асинхронном коде на JavaScript, что критично для создания стабильных приложений.
Промис (Promise) в JavaScript — это объект, представляющий результат асинхронной операции, который может быть выполнен успешно (fulfilled) или с ошибкой (rejected). Ключевой аспект — автоматическая обработка исключений внутри исполнительной функции промиса.
Когда вы создаёте новый промис, передаваемая функция-исполнитель (executor) выполняется немедленно. Если в процессе её выполнения возникает синхронная ошибка (например, вызов неопределённой функции или throw new Error()), механизм промиса автоматически перехватывает эту ошибку и преобразует её в отклонение (rejection). Это означает, что промис не завершится успешно, а перейдёт в состояние rejected с этой ошибкой в качестве причины.
Для обработки отклонённого промиса используется цепочка методов:
Пример с явным throw и обработкой через .catch():
const riskyPromise = new Promise((resolve, reject) => {
// Синхронная ошибка будет перехвачена
throw new Error('Что-то пошло не так!');
// Этот код никогда не выполнится
resolve('Успех');
});
riskyPromise
.then(result => console.log('Результат:', result))
.catch(error => console.error('Поймана ошибка:', error.message));
// Вывод: Поймана ошибка: Что-то пошло не так!Пример с асинхронной ошибкой внутри .then() и обработкой в конце цепочки:
Promise.resolve('начало')
.then(data => {
// Асинхронная ошибка здесь также приведёт к отклонению
return JSON.parse('невалидный JSON');
})
.then(data => console.log('Этот then не выполнится'))
.catch(error => console.error('Ошибка парсинга:', error.message));Пример использования async/await с try/catch:
async function fetchData() {
try {
const result = await someAsyncOperation();
console.log(result);
} catch (error) {
console.error('Ошибка в асинхронной функции:', error);
}
}Если ошибка в промиссе не обработана ни одним .catch(), возникает событие 'unhandledrejection' (в браузере) или процесс может завершиться (в Node.js, в зависимости от версии). Всегда завершайте цепочки промисов обработкой ошибок.
Вывод: Ошибки внутри промисов автоматически преобразуются в отклонения, что требует их явной обработки через .catch() или try/catch. Это фундаментальный механизм для написания надёжного асинхронного кода, предотвращающего неожиданные падения приложений.