自定义ES6 JavaScript错误问题
在一个大型公共库()中重构ES6的自定义错误后,我收到一些奇怪的报告,在一些特殊情况下,这些自定义错误可能无法正确实例化,而在经过多次尝试后,我无法重现这些情况 如果有人在实现自定义错误方面有经验,请告诉我所做的重构是1:1正确,还是我遗漏了什么 原始ES5代码自定义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'
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语法:。我仍然不知道出了什么问题,遗憾的是,应用这个答案中的代码没有帮助。