JavaScriptの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);
}
この例では、promise1
と promise2
は拒否され、promise3
は解決されます。Promise.any()
関数は、いずれかのプロミスが解決されると最初にその値を返し、すべてのプロミスが拒否されると AggregateError
オブジェクトをスローします。
AggregateError.errors
プロパティを使用すると、error.errors[0].message
と error.errors[1].message
のように、個々のエラーメッセージにアクセスできます。
AggregateError.errors
プロパティは、エラーオブジェクトのプロパティであるため、標準の JavaScript プロパティと同じようにアクセスできます。AggregateError
は、ネイティブエラーオブジェクトであるため、特別な処理を行う必要はありません。AggregateError
は ECMAScript 2021 で導入されました。
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
プロパティを使用して、個々のエラーメッセージにアクセスし、コンソールに記録します。
AggregateError.errors
プロパティを使用して、各エラーメッセージをコンソールに記録します。Promise.all()
関数を使用して、すべてのプロミスの解決を待機します。- 3つのプロミスを含む配列
promises
を使用します。
以下の追加例では、さまざまな方法で AggregateError.errors
を使用する方法を示します。
- エラーをロギングする。
- エラーメッセージをフォーマットする。
- 特定のタイプのエラーのみを処理する。
個々のエラーをスローする
最も単純な方法は、個々のエラーをそれぞれスローすることです。これにより、呼び出し側で各エラーを個別に処理することができます。
try {
const error1 = new Error('エラー1');
const error2 = new Error('エラー2');
throw error1;
throw error2; // 到達しないコード
} catch (error) {
console.error(error.message);
}
この例では、error1
と error2
という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);
});
この例では、promise1
と promise2
という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
プロパティを使用して個々のエラーメッセージをコンソールに記録します。