Назад к задачам
Junior — Senior
5

Почему внешний try/catch не ловит ошибку, брошенную внутри Promise

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Разъясните, почему исключение, возникшее внутри тела Promise, не перехватывается внешним блоком try/catch.

try {
  new Promise((resolve, reject) => {
    throw "asda";
  });
} catch (e) {
  console.log("Error", e);
}
  • Внутри конструктора Promise любые синхронные ошибки автоматически преобразуются в отклонённый промис, а не пробрасываются наружу как обычные исключения.
  • Блок try/catch может отловить только ошибки, которые выбрасываются синхронно в текущем стеке вызовов. Ошибка, превратившаяся в отклонение промиса, будет обработана только через методы .catch, await с try/catch внутри асинхронной функции или обработчик отклонения при создании промиса.
  • Чтобы перехватить такую ошибку, нужно добавить обработчик отклонения:
new Promise((resolve, reject) => {
  throw "asda";
}).catch(err => console.log("Caught", err));

или использовать async/await:

(async () => {
  try {
    await new Promise((resolve, reject) => {
      throw "asda";
    });
  } catch (e) {
    console.log("Caught", e);
  }
})();