Обработка исключений в NodeJS Express

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

Как и многие другие языки, Node.js предоставляет механизм для предвидения ошибок до их возникновения. Когда в вашем коде возникает ошибка, она превращается в объект, называемый исключением. Правильная обработка этих исключений позволяет вам изящно восстанавливаться после непредвиденных проблем, что приводит к гораздо лучшему пользовательскому опыту.

Оглавление

  • Создание исключений
  • Объекты исключений
  • Обработка исключений
  • Ловля не пойманных исключений
  • Исключения с обещаниями
  • обработка ошибок в synchronous
  • обработка ошибок в express

Создание исключений

Исключение создается с помощью ключевого слова throw:

Как только JavaScript выполняет эту строку, нормальный ход программы останавливается, и управление передается ближайшему обработчику исключений.

Обычно в коде на стороне клиента значением может быть любое значение JavaScript, включая строку, число или объект.

В Node.js мы не бросаем строки, мы просто бросаем объекты Error.

Объекты ошибок

Объект ошибки — это объект, который является либо экземпляром объекта Error, либо расширяет класс Error, предоставленный в модуле Error core:

Обработка исключений

Обработчик исключений — это оператор try/catch.

Любое исключение, возникшее в строках кода, включенных в блок try, обрабатывается в соответствующем блоке catch:

try {
  // lines of code
} catch (e) {}

Вход в полноэкранный режим Выход из полноэкранного режима

e в этом примере — это значение исключения.

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

Исключения с обещаниями

С помощью обещаний вы можете выстраивать цепочки различных операций и обрабатывать ошибки в конце:


performFunction1()
  .then(performFunction2)
  .then(performFunction3)
  .catch(err => console.error(err));

Войти в полноэкранный режим Выход из полноэкранного режима

Как узнать, где произошла ошибка? На самом деле вы не знаете, но вы можете обрабатывать ошибки в каждой из вызываемых функций (performfunction(x)), а внутри обработчика ошибок бросать новую ошибку, которая вызовет внешний обработчик catch:

const performFunction1 = () => {
  // ...
  try {
    // ...
  } catch (err) {
    // ... handle it locally
    throw new Error(err.message);
  }
  // ...
};
Вход в полноэкранный режим Выход из полноэкранного режима

Чтобы иметь возможность обрабатывать ошибки локально, не обрабатывая их в вызываемой функции, мы можем разорвать цепочку. Можно создать функцию в каждой then() и обрабатывать исключение:

performFunction1()
  .then(() => {
    return performFunction2().catch(err => {
      // handle error
      throw err; // break the chain!
    });
  })
  .then(() => {
    return performFunction3().catch(err => {
      // handle error
      throw err; // break the chain!
    });
  })
  .catch(err => console.error(err));

Вход в полноэкранный режим Выход из полноэкранного режима

Обработка ошибок в Express

Обработка ошибок относится к тому, как Express ловит и обрабатывает ошибки, возникающие как синхронно, так и асинхронно. Express поставляется с обработчиком ошибок по умолчанию, поэтому для начала работы вам не нужно писать свой собственный.

Важно убедиться, что Express отлавливает все ошибки, возникающие при работе обработчиков маршрутов и промежуточного ПО.

Ошибки, возникающие в синхронном коде внутри обработчиков маршрутов и промежуточного ПО, не требуют дополнительной работы. Если синхронный код выбрасывает ошибку, то Express поймает и обработает ее. Например:

app.get('/', (req, res) => {
  throw new Error('BROKEN') // Express will catch this on its own.
})
Войти в полноэкранный режим Выйти из полноэкранного режима

Для ошибок, возвращаемых из асинхронных функций, вызываемых обработчиками маршрутов и промежуточным ПО, вы должны передать их в функцию next(), где Express перехватит и обработает их. Например:

app.get('/', (req, res, next) => {
  fs.readFile('/file-does-not-exist', (err, data) => {
    if (err) {
      next(err) // Pass errors to Express.
    } else {
      res.send(data)
    }
  })
})
Войти в полноэкранный режим Выход из полноэкранного режима

ошибки в асинхронном коде, обработчики маршрутов и промежуточное ПО, возвращающие Promise, будут автоматически вызывать next(value), когда они отклоняют или выбрасывают ошибку. Например:

app.get('/user/:id', async (req, res, next) => {
try{
  const user = await getUserById(req.params.id)
  res.send(user)}
catch(err){next(err)}
})
Войти в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий