PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Как отлавливать исключения в Promise?

Асинхронность и Event Loop

Исключения в Promise ловят через `.catch()` (в цепочке) или `try/catch` с `async/await`. `.catch()` ловит ошибки из всей цепочки выше, включая `throw` в `then`.

.catch() в цепочке

fetchData()
  .then((data) => process(data))
  .then((result) => save(result))
  .catch((error) => {
    handleError(error); // ловит ошибку из любого звена выше
  });

.catch() ловит:

  • Reject любого промиса в цепочке.
  • throw внутри then.
promise
  .then(() => { throw new Error('в then'); })
  .catch((e) => console.log(e.message)); // 'в then'

try/catch с async/await

async function load() {
  try {
    const data = await fetchData();
    const result = await process(data);
  } catch (error) {
    handleError(error); // ловит reject await-нутых промисов
  }
}

finally

Выполняется в любом случае (успех/ошибка):

promise
  .then(handle)
  .catch(handleError)
  .finally(() => hideLoader());

Нюансы

Необработанный reject

Без .catch()/try-catch → unhandledrejection:

window.addEventListener('unhandledrejection', (e) => log(e.reason));

catch не ловит ошибки в setTimeout

new Promise(() => {
  setTimeout(() => { throw new Error(); }, 0); // НЕ поймается .catch()
});

Promise.allSettled — не бросает

Возвращает статусы вместо reject — для обработки каждого результата.

Коротко для собеседования

Исключения в Promise ловят .catch() (в цепочке — ловит reject любого звена и throw в then) или try/catch с async/await. .finally() — в любом случае. Необработанный reject → событие unhandledrejection. .catch() не ловит ошибки в setTimeout-колбэках. Для обработки каждого промиса без падения — Promise.allSettled.

Другие вопросы раздела