Как отловить ошибки через async/await?
Асинхронность и Event Loop
Ошибки через async/await ловят с помощью `try/catch`: блок `try` содержит `await`, `catch` перехватывает reject (или throw). Это основной способ обработки в async-функциях.
try/catch с await
async function loadUser(id) {
try {
const res = await fetch(`/users/${id}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const user = await res.json();
return user;
} catch (error) {
console.error('Ошибка загрузки:', error.message);
// обработка: сообщение, откат, логирование
}
}catch ловит:
- Reject любого
await-нутого промиса. - throw внутри
try.
finally
Выполняется всегда (успех/ошибка) — очистка:
async function load() {
showLoader();
try {
await fetchData();
} catch (e) {
handleError(e);
} finally {
hideLoader(); // в любом случае
}
}Несколько операций
try {
const a = await fetchA();
const b = await fetchB();
} catch (e) {
// ловит ошибку любого await
}Обработка отдельных ошибок
Для гранулярной обработки — отдельные try/catch или Promise.allSettled:
const results = await Promise.allSettled([fetchA(), fetchB()]);
// каждый со статусом, не падаетНюансы
try/catchне ловит ошибки в неотловленных вложенных промисах без await.- Забытый
await→ ошибка не поймается (промис не ожидается).
Коротко для собеседования
Ошибки в async/await ловят try/catch: try с await-выражениями, catch перехватывает reject промиса или throw. finally — для очистки в любом случае. Для нескольких операций — общий try/catch или Promise.allSettled (каждый со статусом, без падения). Забытый await → ошибка не поймается.