Как отлавливать исключения в 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.