Error.captureStackTrace()

Error.captureStackTrace() 静态方法在提供的对象上安装堆栈跟踪信息,作为 stack 属性。

语法

js
Error.captureStackTrace(object)
Error.captureStackTrace(object, constructor)

参数

object

要在其上添加 stack 属性的对象。

constructor 可选

一个函数,通常是创建 object 的构造函数。在收集堆栈跟踪时,此函数最顶层调用之上的所有帧,包括该调用本身,都将从堆栈跟踪中排除。

返回值

无(undefined)。

object 会被就地修改,添加一个名为 stack 的自有属性,其字符串值遵循与 Error.prototype.stack 相同的格式。此属性是不可枚举且可配置的。在 V8 中,它是一个 getter-setter 对。在 SpiderMonkey 和 JavaScriptCore 中,它是一个可写的数据属性。

示例

使用 Error.captureStackTrace()

getStack() 实用函数返回调用时的当前堆栈跟踪,并将其自身从堆栈中移除。这与 console.trace() 具有相同的调试目的,但允许您将字符串输出到其他地方。请注意,它不会为此目的构造一个 Error 实例,而是将 stack 安装在一个普通对象上,这对于我们的目的来说更有效率。通常,您会在打算作为错误抛出的对象上调用 Error.captureStackTrace,如下一个示例所示。

js
function getStack() {
  const obj = {};
  if ("captureStackTrace" in Error) {
    // Avoid getStack itself in the stack trace
    Error.captureStackTrace(obj, getStack);
  }
  return obj.stack;
}

function foo() {
  console.log(getStack());
}

foo();
// Error
//     at foo (<anonymous>:8:15)
//     at <anonymous>:11:1

在自定义错误对象上安装堆栈跟踪

Error.captureStackTrace() 的主要用例是在自定义错误对象上安装堆栈跟踪。通常,您通过扩展 Error 类来定义 自定义错误,这会自动通过继承使 stack 属性可用。然而,默认堆栈跟踪的问题是它包含了构造函数调用本身,这会泄露实现细节。您可以通过使用 Error.captureStackTrace() 来避免这种情况,它允许即使对于不继承自 Error 的自定义错误也能安装堆栈跟踪。

js
class MyError extends Error {
  constructor(message, options) {
    super(message, options);
    if ("captureStackTrace" in Error) {
      // Avoid MyError itself in the stack trace
      Error.captureStackTrace(this, MyError);
    }
  }
}

const myError = new MyError("Something went wrong");
console.log(myError.stack);
// Error: Something went wrong
//     at <anonymous>:8:17

请注意,即使您在这里没有调用 Error.captureStackTrace(),一些引擎仍然足够智能,可以避免在堆栈跟踪中出现 MyError(如果构造函数继承自 Error)。对于出于某种原因不继承自 Error 的自定义错误,调用 Error.captureStackTrace() 更为重要。

js
class MyError {
  constructor(message) {
    this.message = message;
    if ("captureStackTrace" in Error) {
      // Avoid MyError itself in the stack trace
      Error.captureStackTrace(this, MyError);
    }
  }
}

const myError = new MyError("Something went wrong");
console.log(myError.stack);
// Error: Something went wrong
//     at <anonymous>:8:17

规范

规范
未知规范
# errorcapturestacktrace-1

浏览器兼容性

另见