Новое свойство cause в объекте error позволяет узнать исходную причину сбоя и облегчить отладку, особенно при повторении ошибок. Оно помогает выстроить цепочку событий и лучше понимать, где возникла проблема. Свойство доступно в Baseline в статусе «Widely Available» с 20 марта 2024 года.

Что такое cause и зачем оно нужно

Сегодня вам бесплатно доступен тренажёр по HTML и CSS.

При работе с ошибками в JavaScript часто возникает ситуация, когда нужно перехватить исключение, выполнить какие-то действия, а затем выбросить новую ошибку. В такой цепочке легко потерять исходную причину. Свойство cause позволяет передать оригинальную ошибку дальше по цепочке, не теряя контекста.

Простой пример с cause

В следующем коде создаются две ошибки — одна основная и одна обёрточная, которая включает первую в качестве причины:

try {
  // что-то может привести к ошибке
  throw new Error('Ошибка 1');
} catch (error) {
  // повторный выброс с указанием причины
  throw new Error('Обработка ошибки', { cause: error });
}

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

Как узнать причину ошибки

try {
  try {
    throw new Error('Исходная ошибка');
  } catch (inner) {
    throw new Error('Новая ошибка', { cause: inner });
  }
} catch (final) {
  console.error(final.message); // 'Новая ошибка'
  console.error(final.cause);   // Error: 'Исходная ошибка'
}

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

Преимущества использования cause

  • Позволяет не терять контекст исходной ошибки.
  • Упрощает трассировку ошибок в логах и отладке.
  • Работает стандартно и понятно, без необходимости придумывать собственные обёртки или поля.

Совместимость

Свойство cause поддерживается в современных браузерах и средах, включая Node.js.

Больше обзоров веб-функций — в телеграм-канале HTML Academy.

Нашли ошибку или опечатку? Напишите нам.