コンテキストでNode.jsエラー

V89.3以降でスローにエラー原因を追加する方法

エラーの詳細コンテキスト

V8 Javascriptエンジンのバージョン9.3以降、開発者はデフォルトのエラーをスローするときに新しいタイプの情報を追加するオプションがあります。単一の引数を指定する代わりに、エラー原因とも呼ばれる一種のエラータイプを追加できるため、このようなエラーをキャッチするためのハンドラーは、エラーの発生元をより適切に判断できます。

より正確には、Error-constructorは、オプションのオブジェクトである2番目のオプションのパラメーターを受け入れます。このパラメーターでは、プロパティ「cause」を使用できます。

例を見てみましょう。

/**
 * 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;
    }
  }
}

エラー原因の利点

エラーの原因を使用することの明らかな利点は、コード内の同様のケースを処理するためにカスタムのエラークラスを定義する必要がないことです。一方、エラーの原因に対する標準的なメカニズムがあると、デバッグツールでもうまく機能します。

V8バージョン9.3以降で利用可能

現在の最新のNode.jsバージョン16.4.2はV8の最新の安定バージョンである9.1を使用しているため、執筆時点では、この変更はまだ公開されていません。 Node.jsがバージョン9.3の使用を開始するときに、それに応じてこの記事を更新します。