如何覆盖错误堆栈getter

时间:2016-02-14 14:04:29

标签: javascript ecmascript-6

我的目标是编写一个新类,它将扩展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);

但我得到的只是没有新数据的原始堆栈消息。

1 个答案:

答案 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);
    }
}());