lob*_*3rd 3 javascript ecmascript-6
我的目标是编写一个新类来扩展 javascript 原生 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);
Run Code Online (Sandbox Code Playgroud)
但我得到的只是原始堆栈消息,没有新数据。
您应该做更多的工作来扩展 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);
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的平台不支持 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);
}
}());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2200 次 |
| 最近记录: |