SuppressedError
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"
。
注意: SuppressedError
永远没有 cause
属性,因为 cause
的语义与 suppressed
有重叠。
这些属性是每个 SuppressedError
实例的自有属性。
error
-
对导致抑制的错误的引用。
suppressed
-
对被
error
抑制的错误的引用。
实例方法
继承了其父级 Error
的实例方法。.
示例
捕获 SuppressedError
当在 资源处理 过程中发生错误时,会抛出一个 SuppressedError
。抛出错误会触发作用域清理,清理过程中的每个析构函数都可能抛出自己的错误。所有这些错误都会被收集到一个 SuppressedError
实例的链中,原始错误作为 suppressed
属性,下一个析构函数抛出的新错误作为 error
属性。
try {
using resource1 = {
[Symbol.dispose]() {
throw new Error("Error while disposing resource1");
},
};
using resource2 = {
[Symbol.dispose]() {
throw new Error("Error while disposing resource2");
},
};
throw new Error("Original error");
} catch (e) {
console.log(e instanceof SuppressedError); // true
console.log(e.message); // "An error was suppressed during disposal"
console.log(e.name); // "SuppressedError"
console.log(e.error); // Error: Error while disposing resource1
console.log(e.suppressed); // SuppressedError: An error was suppressed during disposal
console.log(e.suppressed.error); // Error: Error while disposing resource2
console.log(e.suppressed.suppressed); // Error: Original error
}
链条看起来是这样的
SuppressedError --suppressed--> SuppressedError --suppressed--> Original error | | error error v v Error while disposing resource1 Error while disposing resource2 (Disposal happens later) (Disposal happens earlier)
创建 SuppressedError
try {
throw new SuppressedError(
new Error("New error"),
new Error("Original error"),
"Hello",
);
} catch (e) {
console.log(e instanceof SuppressedError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "SuppressedError"
console.log(e.error); // Error: "New error"
console.log(e.suppressed); // Error: "Original error"
}
规范
规范 |
---|
ECMAScript 异步显式资源管理 # sec-suppressederror-objects |
浏览器兼容性
加载中…