SuppressedError
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
SuppressedError は、別のエラーを処理している際に発生したエラーを表すオブジェクトです。これは、using または await using を使用したリソースの破棄中に生成されます。
AggregateError と比べると、SuppressedError は 別のエラーによって抑制された単一のエラーを表すのに対し、AggregateError は無関係なエラーのリストを表します。ただし、SuppressedError が抑制されたエラーのチェーン(e.suppressed.suppressed.suppressed...)を含められます。また、cause とは意味的に異なります。なぜなら、そのエラーは別のエラーによって「引き起こされる」のではなく、別のエラーを処理している際に「発生する」からです。
SuppressedError は Error のサブクラスです。
コンストラクター
SuppressedError()-
SuppressedErrorオブジェクトを生成します。
インスタンスプロパティ
継承元の Error からインスタンスプロパティも継承します。
これらのプロパティは SuppressedError.prototype に定義されており、すべての SuppressedError インスタンスで共有されます。
SuppressedError.prototype.constructor-
インスタンスオブジェクトを生成したコンストラクター関数。
SuppressedErrorインスタンスの場合、初期値はSuppressedErrorコンストラクターです。 SuppressedError.prototype.name-
エラーの種類を表す名前。
SuppressedError.prototype.nameの初期値は"SuppressedError"です。
メモ:
cause と suppressed の意味論が重複するため、SuppressedError は cause プロパティを持ちません。
これらのプロパティは各 SuppressedError インスタンスの固有のプロパティです。
error-
抑制の結果としてのエラーへの参照。
suppressed-
errorによって抑制されたエラーへの参照。
インスタンスメソッド
親 Error からインスタンスメソッドを継承します。
例
>SuppressedError のキャッチ
SuppressedError は、リソースの破棄 中にエラーが発生したときにスローされます。エラーをスローするとスコープのクリーンアップが行われ、クリーンアップ中の各 disposer は独自のエラーをスローできます。これらのエラーはすべて SuppressedError インスタンスのチェーンに収集され、元のエラーが suppressed プロパティとして、次の disposer によってスローされた新しいエラーが error プロパティとして格納されます。
try {
using resource1 = {
[Symbol.dispose]() {
throw new Error("resource1 の破棄中にエラーが発生しました");
},
};
using resource2 = {
[Symbol.dispose]() {
throw new Error("resource2 の破棄中にエラーが発生しました");
},
};
throw new Error("元のエラー");
} catch (e) {
console.log(e instanceof SuppressedError); // true
console.log(e.message); // "破棄中にエラーが抑制されました"
console.log(e.name); // "SuppressedError"
console.log(e.error); // Error: resource1 の破棄中にエラーが発生しました
console.log(e.suppressed); // SuppressedError: 破棄中にエラーが抑制されました
console.log(e.suppressed.error); // Error: resource2 の破棄中にエラーが発生しました
console.log(e.suppressed.suppressed); // Error: 元のエラー
}
チェーンは次のようになります:
SuppressedError --suppressed--> SuppressedError --suppressed--> 元のエラー
| |
error error
v v
resource1 の破棄中にエラーが発生しました resource2 の破棄中にエラーが発生しました
(破棄は後で行われます) (破棄は先に行われます)
SuppressedError の作成
try {
throw new SuppressedError(
new Error("新しいエラー"),
new Error("元のエラー"),
"こんにちは",
);
} catch (e) {
console.log(e instanceof SuppressedError); // true
console.log(e.message); // "こんにちは"
console.log(e.name); // "SuppressedError"
console.log(e.error); // Error: "新しいエラー"
console.log(e.suppressed); // Error: "元のエラー"
}
仕様書
| Specification |
|---|
| ECMAScript Async Explicit Resource Management> # sec-suppressederror-objects> |