我的目标是编写一个新类,它将扩展javascripts本机Error类,以支持更好的堆栈消息。
所以我想要做的仍然是能够调用error.stack但是要获得更好的堆栈消息,这也将包括原始堆栈跟踪以及我自己的更多数据。
我不确定如何实现这一目标:
'use strict'
class MyError extends Error {
constructor(error) {
super(error);
}
get stack() {
return "extended" + this.stack;
}
}
var error = new MyError("my error");
console.log(error.stack);
但我得到的只是没有新数据的原始堆栈消息。
答案 0 :(得分:2)
您应该为扩展Error类做更多的工作:
class MyError extends Error {
constructor(message) {
super(message);
this.name = this.constructor.name;
this.message = message;
// standard way: Error.captureStackTrace(this, this.constructor.name);
// if you do this, you couldn't set different getter for the 'stack' property
this.stack = new Error().stack; // do this, if you need a custom getter
}
get stack() {
return "extended " + this._stack;
}
set stack(stack) {
this._stack = stack;
}
}
try {
throw new MyError('My error');
} catch(e) {
console.log(e.stack);
}
如果您使用的平台不支持getter / setter,您可以使用Object.defineProperty:
(function() {
'use strict';
class MyError extends Error {
constructor(message) {
super(message);
this.name = this.constructor.name;
this.message = message;
Object.defineProperty(this, 'stack', {
get: function() { return 'extended ' + this._stack; },
set: function(value) { this._stack = value; }
});
this.stack = new Error().stack;
}
}
try {
throw new MyError('test');
} catch (e) {
console.log(e.stack);
}
}());