Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: Promise, error handling, try catch, async await, reject

Что произойдет, если внутри Promise возникнет ошибка?

Вопрос проверяет понимание обработки ошибок в асинхронном коде на JavaScript, что критично для создания стабильных приложений.

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

Если внутри Promise возникнет ошибка, она будет автоматически перехвачена, и промис перейдёт в состояние 'rejected'. Это можно обработать с помощью метода .catch() или блока try/catch при использовании async/await. Без обработки ошибка станет 'необработанным отклонением промиса' (unhandled promise rejection), что может привести к падению приложения в Node.js или неожиданному поведению в браузере. Всегда обрабатывайте ошибки промисов для устойчивости кода.

Длинный ответ

Промис (Promise) в JavaScript — это объект, представляющий результат асинхронной операции, который может быть выполнен успешно (fulfilled) или с ошибкой (rejected). Ключевой аспект — автоматическая обработка исключений внутри исполнительной функции промиса.

Как ошибки преобразуются в отклонение промиса

Когда вы создаёте новый промис, передаваемая функция-исполнитель (executor) выполняется немедленно. Если в процессе её выполнения возникает синхронная ошибка (например, вызов неопределённой функции или throw new Error()), механизм промиса автоматически перехватывает эту ошибку и преобразует её в отклонение (rejection). Это означает, что промис не завершится успешно, а перейдёт в состояние rejected с этой ошибкой в качестве причины.

Обработка ошибок: методы .catch() и async/await

Для обработки отклонённого промиса используется цепочка методов:

  • .catch(): прикрепляется к промису и вызывается, если любой промис в цепочке выше был отклонён.
  • .finally(): выполняется в любом случае, после разрешения или отклонения.
  • В асинхронных функциях можно использовать try/catch вокруг await.

Примеры кода

Пример с явным 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);
  }
}

Необработанные отклонения (Unhandled Rejection)

Если ошибка в промиссе не обработана ни одним .catch(), возникает событие 'unhandledrejection' (в браузере) или процесс может завершиться (в Node.js, в зависимости от версии). Всегда завершайте цепочки промисов обработкой ошибок.

Вывод: Ошибки внутри промисов автоматически преобразуются в отклонения, что требует их явной обработки через .catch() или try/catch. Это фундаментальный механизм для написания надёжного асинхронного кода, предотвращающего неожиданные падения приложений.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#Promise

#error handling

#try catch

#async await

#reject

Подпишись на React Developer в телеграм