Ошибка Node.js с контекстом

Как добавить причину ошибки к выбросам в V8 9.3 и новее

Больше контекста для ошибок

Начиная с версии 9.3 механизма Javascript V8, разработчики будут иметь возможность добавлять новый тип информации при выдаче ошибки по умолчанию. Вместо предоставления одного аргумента вы сможете добавить тип ошибки, также называемый причиной ошибки, чтобы обработчик для перехвата таких ошибок мог лучше определить, откуда возникла ошибка.

Точнее, конструктор ошибок принимает второй необязательный параметр, который является объектом параметров, где может использоваться свойство «причина».

Давайте посмотрим на пример.

/**
 * A simple demonstration how
 * the syntax will benefit from
 * the error-cause option in
 * new Errors.
 * 
 * Note that the example is greatly
 * simplified to focus on the 
 * relevant changes.
 */
async function processImage(props) {
  try {
    await minifyImage(props);
  } catch (err) {
    throw new Error('image-minification', { cause: err });
  }
  try {
    await uploadImage(props);
  } catch (err) {
    throw new Error('image-upload', { cause: err });
  }
  try {
    await cleanUpCache(props);
    await notifyUser(props);
  } catch (err) {
    throw new Error('post-processing', { cause: err });
  }
}

//
// ... later in our code ...
//

async function selectAndUploadImage(props){
  try {
    await processImage(props);
  } catch (err) {
    console.error(err.cause);
    
    switch(err) {
      case 'image-minification':
        // handle the minification error,
        // which is available by accessing
        // 'err.cause'.
        break;
      case 'image-upload':
        // ...
        break;
      case 'post-processing':
        // ...
        break;
    }
  }
}

Преимущество причины ошибки

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

Доступно с V8 версии 9.3 и новее

На момент написания это изменение еще не доступно для публичного использования, поскольку в последней версии Node.js версии 16.4.2 используется последняя стабильная версия V8, а именно 9.1. Когда Node.js начнет использовать версию 9.3, я соответствующим образом обновлю эту статью.

Предложения

Связанные

Приложение

Языки