SuppressedError

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

SuppressedError 对象表示在处理另一个错误时产生的错误。它在使用 usingawait using 进行资源处理时生成。

AggregateError 相比,SuppressedError 用于表示一个被另一个错误抑制的单个错误,而 AggregateError 表示一组不相关的错误。然而,一个 SuppressedError 可能包含一个被抑制错误的链(e.suppressed.suppressed.suppressed...)。它在语义上也与 cause 不同,因为这个错误不是由另一个错误引起的,而是在处理另一个错误时发生的

SuppressedErrorError 的一个子类。

构造函数

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 属性。

js
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

js
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

浏览器兼容性

另见