自定义ES6 JavaScript错误问题

自定义ES6 JavaScript错误问题,javascript,ecmascript-6,Javascript,Ecmascript 6,在一个大型公共库()中重构ES6的自定义错误后,我收到一些奇怪的报告,在一些特殊情况下,这些自定义错误可能无法正确实例化,而在经过多次尝试后,我无法重现这些情况 如果有人在实现自定义错误方面有经验,请告诉我所做的重构是1:1正确,还是我遗漏了什么 原始ES5代码 function CustomError(errCode) { var temp = Error.apply(this, arguments); temp.name = this.name = 'CustomError'

在一个大型公共库()中重构ES6的自定义错误后,我收到一些奇怪的报告,在一些特殊情况下,这些自定义错误可能无法正确实例化,而在经过多次尝试后,我无法重现这些情况

如果有人在实现自定义错误方面有经验,请告诉我所做的重构是1:1正确,还是我遗漏了什么

原始ES5代码

function CustomError(errCode) {
    var temp = Error.apply(this, arguments);
    temp.name = this.name = 'CustomError';
    this.stack = temp.stack;
    this.code = errCode;
}

CustomError.prototype = Object.create(Error.prototype, {
    constructor: {
        value: CustomError,
        writable: true,
        configurable: true
    }
});

CustomError.prototype.toString = function () {
    console.log('errCode:', this.code);
};

CustomError.prototype.inspect = function () {
    return this.toString();
};
重构的ES6代码:

class CustomError extends Error {
    constructor(errCode) {
        super();
        Error.captureStackTrace(this, CustomError);
        this.code = errCode;
    }
}

CustomError.prototype.toString = function () {
    console.log('errCode:', this.code);
};

CustomError.prototype.inspect = function () {
    return this.toString();
};
在任何Node.js 4.x及更高版本下,这两个示例都需要相同的工作方式,实例化为:

const error = new CustomError(123);
console.log(error);
根据一份bug报告,有时这样的类型被认为是在没有正确的
上下文的情况下创建的,或者更准确地说,错误是:
不能使用
toString
中未定义的
的“code”

更新

看了这篇文章:,以及它的例子:

class GoodError extends Error {
    constructor(...args) {
        super(...args)
        Error.captureStackTrace(this, GoodError)
    }
}
看来,像这样传递论点是我所缺少的。但是,考虑到以下情况,我如何才能正确地更新我的
CustomError
类以执行相同的操作:

  • 语法
    …args
    在Node.js 4.x中不起作用,因此我无法使用它
  • 我需要将其与现有的custruction参数相结合,例如
    errCode

我相信这相当于您的ES5代码

class CustomError extends Error {

    constructor( errCode ){
        super(...arguments);
        this.name = "CustomError";
        this.code = errCode;
    }

    toString(){
        console.log('errCode:', this.code);
    }

    inspect(){
        return this.toString();
    }

}
您可以将
super(…参数)
替换为

super();
Error.apply(this, arguments);

需要注意的一件事是
super()
应该是
super(参数)
@destoryer不应该是
super(…参数)
?@PeterMader是的,谢谢。我想不出你能做什么来阻止
这个
上下文被正确传递。你为什么要使用类语法和原型语法?为什么不用呢?谢谢!这将花费我几天时间从图书馆的用户那里获得反馈,以了解这是否有助于解决问题。但目前看来这是我能尝试的最好的了。不过你为什么跳过这一行<代码>错误。captureStackTrace(这是CustomError)
。我认为它对于捕获堆栈跟踪至关重要。它不在ES5代码中,我相信它是多余的
super(…arguments)
,或者通常是
newerror()
设置
.stack
属性。不是根据这个:或者这个家伙错了吗?在所有的反馈和大量的实验之后,我放弃了,并将所有内容恢复为ES5语法:。我仍然不知道出了什么问题,遗憾的是,应用这个答案中的代码没有帮助。