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

Как отловить ошибки через 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 → ошибка не поймается.

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