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

Как обрабатывать ошибки в асинхронном коде на Node.js?

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

Ошибки в асинхронном коде обрабатываются в зависимости от стиля: try/catch для await, .catch для промисов и событие error для потоков и эмиттеров.

Способы

  • async/await: оборачиваем await в try/catch.
  • Promise: .catch() в конце цепочки.
  • Колбэки в стиле Node.js: первый аргумент err, его проверяют сразу.
  • EventEmitter: без обработчика события error процесс упадёт.

Глобальные ловушки

  • process.on('unhandledRejection', ...) — промис завершился ошибкой без обработчика. С Node.js 15 по умолчанию это валит процесс.
  • process.on('uncaughtException', ...) — исключение, которое никто не поймал. Состояние процесса после него ненадёжно, поэтому разумно залогировать и корректно завершиться.
async function load(id) {
  try {
    return await fetchUser(id);
  } catch (err) {
    logger.error({ err, id }, 'load failed');
    throw err; // не глотаем ошибку молча
  }
}

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

Ловите ошибки там, где умеете их обработать, и пробрасывайте остальные. Глобальные обработчики нужны для логирования и аккуратного завершения, а не для продолжения работы.

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