语法
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
,如下一个示例所示。
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
的自定义错误也能安装堆栈跟踪。
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()
更为重要。
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 |
浏览器兼容性
加载中…