JavaScriptのAggregateError.errors: 詳細なエラー処理を可能にする強力なツール

2024-05-27

JavaScriptにおける「AggregateError.errors」の分かりやすい解説

AggregateError.errors プロパティは、このエラーオブジェクトに含まれる個々のエラーの配列を格納します。このプロパティを使用することで、各エラーの詳細情報にアクセスし、適切な処理を行うことができます。

以下に、AggregateError.errors の使用方法に関する具体的な例を示します。

try {
  const promise1 = Promise.reject(new Error('エラー1'));
  const promise2 = Promise.reject(new Error('エラー2'));
  const promise3 = Promise.resolve('成功');

  Promise.any([promise1, promise2, promise3]).then(
    (result) => console.log(result),
    (error) => {
      if (error instanceof AggregateError) {
        console.error('AggregateErrorが発生しました。');
        for (const err of error.errors) {
          console.error(err.message);
        }
      } else {
        console.error(error.message);
      }
    }
  );
} catch (error) {
  console.error(error.message);
}

この例では、promise1promise2 は拒否され、promise3 は解決されます。Promise.any() 関数は、いずれかのプロミスが解決されると最初にその値を返し、すべてのプロミスが拒否されると AggregateError オブジェクトをスローします。

AggregateError.errors プロパティを使用すると、error.errors[0].messageerror.errors[1].message のように、個々のエラーメッセージにアクセスできます。

補足:

  • AggregateError は ECMAScript 2021 で導入されました。
  • AggregateError は、ネイティブエラーオブジェクトであるため、特別な処理を行う必要はありません。
  • AggregateError.errors プロパティは、エラーオブジェクトのプロパティであるため、標準の JavaScript プロパティと同じようにアクセスできます。


    AggregateError.errors を使用する際のサンプルコード

    try {
      const promises = [
        Promise.reject(new Error('ファイル読み取りエラー')),
        Promise.reject(new Error('ネットワークエラー')),
        Promise.resolve('データ取得成功')
      ];
    
      Promise.all(promises).then(
        (results) => console.log(results),
        (error) => {
          if (error instanceof AggregateError) {
            console.error('AggregateErrorが発生しました。');
            for (const err of error.errors) {
              console.error(`エラーが発生しました: ${err.message}`);
            }
          } else {
            console.error(error.message);
          }
        }
      );
    } catch (error) {
      console.error(error.message);
    }
    

    このコードでは、3つのプロミスを含む配列 promises が定義されています。最初の2つのプロミスは拒否され、3番目のプロミスは解決されます。

    Promise.all() 関数は、すべてのプロミスが解決されると配列を返し、いずれかのプロミスが拒否されると最初の拒否されたプロミスの値をスローします。

    この例では、Promise.all() が拒否されるため、AggregateError オブジェクトがスローされます。AggregateError.errors プロパティを使用して、個々のエラーメッセージにアクセスし、コンソールに記録します。

    このサンプルコードは、以下の点において前の例を拡張しています。

    • 3つのプロミスを含む配列 promises を使用します。
    • Promise.all() 関数を使用して、すべてのプロミスの解決を待機します。
    • AggregateError.errors プロパティを使用して、各エラーメッセージをコンソールに記録します。

    このサンプルコードは、AggregateError.errors プロパティを使用して、複数のエラーを処理する方法をより詳細に示しています。

    以下の追加例では、さまざまな方法で AggregateError.errors を使用する方法を示します。

    • 特定のタイプのエラーのみを処理する。
    • エラーメッセージをフォーマットする。
    • エラーをロギングする。

    これらの例は、AggregateError.errors プロパティの柔軟性を示し、さまざまな状況でどのように使用できるかを示しています。



    AggregateError.errors 以外の代替手段

    個々のエラーをスローする:

    最も単純な方法は、個々のエラーをそれぞれスローすることです。これにより、呼び出し側で各エラーを個別に処理することができます。

    try {
      const error1 = new Error('エラー1');
      const error2 = new Error('エラー2');
    
      throw error1;
      throw error2; // 到達しないコード
    } catch (error) {
      console.error(error.message);
    }
    

    この例では、error1error2 という2つのエラーがスローされます。呼び出し側では、catch ブロックを使用して各エラーを処理することができます。

    Promise.catch() を使用する:

    非同期操作でエラーが発生する場合は、Promise.catch() メソッドを使用してエラーを処理することができます。

    const promise1 = Promise.reject(new Error('エラー1'));
    const promise2 = Promise.reject(new Error('エラー2'));
    
    promise1.catch((error) => {
      console.error(error.message);
    });
    
    promise2.catch((error) => {
      console.error(error.message);
    });
    

    この例では、promise1promise2 という2つの非同期操作が実行されます。いずれかの操作が失敗すると、catch メソッドが呼び出され、エラーメッセージがコンソールに記録されます。

    カスタムエラーオブジェクトを使用する:

    より複雑なシナリオでは、カスタムエラーオブジェクトを作成して、複数のエラー情報を格納することができます。

    class MultipleErrors extends Error {
      constructor(errors) {
        super('複数のエラーが発生しました');
        this.errors = errors;
      }
    }
    
    try {
      const error1 = new Error('エラー1');
      const error2 = new Error('エラー2');
    
      throw new MultipleErrors([error1, error2]);
    } catch (error) {
      if (error instanceof MultipleErrors) {
        console.error('カスタムエラーが発生しました:');
        for (const err of error.errors) {
          console.error(err.message);
        }
      } else {
        console.error(error.message);
      }
    }
    

    この例では、MultipleErrors というカスタムエラークラスが定義されています。このクラスは、errors プロパティという配列を持ち、複数のエラーを格納することができます。

    コードを実行すると、MultipleErrors オブジェクトがスローされます。catch ブロックでは、エラーインスタンスが MultipleErrors インスタンスかどうかを確認し、errors プロパティを使用して個々のエラーメッセージをコンソールに記録します。

    最適な方法を選択する:

    使用する方法は、状況によって異なります。単純なエラー処理の場合は、個々のエラーをスローするのが最善の方法です。非同期操作でエラーが発生する場合は、Promise.catch() メソッドを使用するのが適切です。より複雑なシナリオでは、カスタムエラーオブジェクトを使用して、複数のエラー情報を格納することができます。

    AggregateError は、複数のエラーを単一のエラーオブジェクトにまとめる便利な機能ですが、必ずしも最適な方法とは限りません。状況に応じて適切な方法を選択することが重要です。