【发布时间】:2015-10-26 12:25:51
【问题描述】:
(在节点版本 '4.2.1'、v8 '4.5.103.35' 上)
var TE = class tError extends Error {
constructor(message) {
super(message);
this.name = tError.name;
Error.captureStackTrace(this, tError);
}
static prepareStackTrace() {
console.log('run is prepareStackTrace');
return 'MyPrepareStack'
}
get stack() {
console('getter stack');
return 'MyStack';
}
};
TE.stackTraceLimit = 1;
console.log('ErrorPrepare:', TE.prepareStackTrace);
var e = new TE('MyError');
console.log('ErrorName: ', e.name);
console.log('ErrorStack: ', e.stack);
OUTPUT:
D:\>node ./Error
ErrorPrepare: prepareStackTrace() {
console.log('run is prepareStackTrace');
return 'MyPrepareStack'
}
ErrorName: tError
ErrorStack: tError: MyError
at Object.<anonymous> (D:\Error.js:23:9)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:467:10)
at startup (node.js:134:18)
at node.js:961:3
使用本机 API 的 getter 不适合我。
如何使用本机 stackTrace API Error.prepareStackTrace 格式化 stackTrace?
【问题讨论】:
-
captureStackTracevsprepareStackTrace? -
我还是不明白这个问题。那些静态方法没有被调用,因为代码没有调用它们,好吧。
-
@E_net4 静态方法似乎与问题无关。 (但也许我错了;OP,请澄清一下?)这里(对我来说)有趣的问题是为什么在访问
e.stack时没有调用类的stackgetter。也就是说,Error的stack的 getter 正在运行,而不是tError的 getter,即使e是tError实例。 -
我的猜测是
Error.captureStackTrace()创建了一个实例stack属性,它会影响原型上的getter。 -
问题是永远不会调用“get stack()”,即使将类描述为:class tError extends Error { get stack() { return 'MyStack'; } };
标签: javascript node.js v8 stack-trace