Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

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

При каких условиях выполняется catch в Promise?

Этот вопрос проверяет понимание обработки ошибок в промисах JavaScript, что необходимо для написания надёжного асинхронного кода.

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

Метод catch в Promise выполняется, когда промис переходит в состояние rejected (отклонён). Это происходит, если внутри промиса вызывается reject() или возникает необработанная ошибка (exception). catch также перехватывает ошибки, выброшенные в цепочке then перед ним. Если промис завершается успешно (resolve), блок catch пропускается, и выполнение продолжается в следующем then.

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

Промисы (Promises) в JavaScript представляют собой механизм для работы с асинхронными операциями. Они могут находиться в одном из трёх состояний: pending (ожидание), fulfilled (выполнено успешно) и rejected (выполнено с ошибкой). Метод .catch() — это специальный обработчик, который вызывается именно при переходе промиса в состояние rejected.

Основные условия срабатывания catch

  • Явный вызов reject(): Когда внутри исполнительной функции промиса вызывается функция reject.
  • Необработанное исключение (throw): Если в теле промиса или в синхронной функции then возникает ошибка, которая не перехвачена try...catch.
  • Провал предыдущего промиса в цепочке: catch перехватывает ошибки из любого промиса, расположенного выше в цепочке вызовов.

Практический пример

Рассмотрим код, демонстрирующий разные сценарии:

// 1. Явный reject
const promise1 = new Promise((resolve, reject) => {
    reject(new Error('Что-то пошло не так'));
});
promise1.catch(err => console.log('Сценарий 1:', err.message));

// 2. Необработанная ошибка
const promise2 = new Promise((resolve, reject) => {
    throw new Error('Синхронная ошибка');
});
promise2.catch(err => console.log('Сценарий 2:', err.message));

// 3. Ошибка в цепочке then
Promise.resolve()
    .then(() => {
        throw new Error('Ошибка в then');
    })
    .catch(err => console.log('Сценарий 3:', err.message)); // Сработает

// 4. Успешное выполнение — catch игнорируется
Promise.resolve('Успех')
    .then(msg => console.log(msg))
    .catch(err => console.log('Это не выполнится'))
    .then(() => console.log('Цепочка продолжается'));

Важно помнить, что catch возвращает новый промис. Это позволяет строить длинные цепочки обработки, где после исправления ошибки можно продолжить выполнение.

Вывод: Используйте .catch() для централизованной обработки всех возможных ошибок в асинхронных операциях. Это делает код чище и предотвращает "тихие" падения приложения. Всегда добавляйте catch в конец цепочки промисов, чтобы ни одна ошибка не осталась необработанной.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

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

#Promise

#catch

#error handling

#async

#JavaScript

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