Выбор ответа Junior Ошибки спрашивают часто обновлено

try/catch вокруг async-вызова без await

Вопрос

loadData это async-функция, которая отклоняется с ошибкой. Почему catch не срабатывает?

function init() {
  try {
    loadData();
  } catch (err) {
    showError(err);
  }
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: loadData() сразу отдаёт промис, а отклонение придёт, когда try уже позади. Синхронный try/catch ловит только исключения, возникшие во время выполнения блока.

Варианты ответа

  1. catch не работает внутри функций, только на верхнем уровне модуля
  2. Async-функции не умеют бросать ошибки, они только возвращают undefined
  3. Нужно писать catch (err: Error), иначе тип ошибки не определится и её пропустят
  4. loadData() сразу отдаёт промис, а отклонение придёт, когда try уже позадиправильный ответ

Разбор

Синхронный try/catch ловит только исключения, возникшие во время выполнения блока. Вызов async-функции просто возвращает промис, ошибки в этот момент нет. Отклонение придёт позже, и его никто не обработает. Исправление: сделать init асинхронной и писать await loadData(), либо loadData().catch(showError). Аннотация типа в catch в JavaScript невозможна, а в TypeScript ничего бы не изменила.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме