我之前用过Joyent的Verror来避免重抛异常导致堆栈跟踪丢失,最近使用Node v12测试了一下,发现即使不使用Verror也能保留堆栈跟踪。
然后我看了一下Error.captureStackTrace的使用方法,它表示在错误处理中使用它可以避免错误被添加到堆栈中。
我不知道我做错了什么,但是使用或不使用Error.captureStackTrace,堆栈跟踪都是相同的。
我想知道captureStackTrace的当前状态,因为我看不出任何区别,并且VError似乎不再需要了。
文档中说,如果不调用captureStackTrace,则.stack不可用,但每次都可以看到,无论是否调用captureStackTrace。
以下是两个错误示例:
class MyErrorOne extends Error {
constructor(message) {
super(message);
Error.captureStackTrace(this, this.constructor);
}
}
class MyErrorTwo extends Error {
constructor(message) {
super(message);
Error.captureStackTrace(this, this.constructor);
}
}
我试着通过注释掉每个错误中的captureStackTrace方法来测试它们,但是堆栈跟踪结果都是一样的。
有人能帮忙吗?
这是我的测试代码:
const DoOne = () => {
try {
console.log("executing do one");
DoTwo();
} catch (error) {
console.log("error in DoOne", error);
console.log("here is the stack ", error.stack);
throw new MyErrorOne("threw error from doone in myerrorone");
// throw error;
}
};
const DoTwo = () => {
try {
console.log("executing do two");
throw new MyErrorTwo("threw error from dotwo in myerrortwo");
} catch (error) {
console.log("error in DoTwo", error);
throw error;
}
};
DoOne();