【发布时间】:2016-02-26 15:12:53
【问题描述】:
参考this,ES6中的自定义错误可以写成如下:
class MyError extends Error {
constructor(message) {
super(message);
this.message = message;
this.name = 'MyError';
}
}
感谢
super()调用,无需this.stack = (new Error()).stack;技巧。
不过,我是在Babel下测试的
class MyError extends Error {
constructor(message) {
super(message);
this.message = message;
this.name = 'MyError';
//this.stack = (new Error()).stack;
//Error.captureStackTrace(this, this.constructor.name);
}
}
var myerror = new MyError("test");
console.log(myerror.stack)
除非调用代码this.stack = (new Error()).stack; 或Error.captureStackTrace(this, this.constructor.name);,否则没有堆栈信息。
但是我在Chrome console下没有this.stack = (new Error()).stack;或Error.captureStackTrace(this, this.constructor.name);测试上面的代码sn -p。
输出:
MyError: test
at MyError (<anonymous>:3:28)
at <anonymous>:12:19
at Object.InjectedScript._evaluateOn (<anonymous>:875:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34)
at Object.InjectedScript.evaluate (<anonymous>:664:21)
我应该认为这是Babel 或Chrome 问题上的一个缺陷吗?或者错过了解super()?
更新
根据V8代码,Error的stack
captureStackTrace = function captureStackTrace(obj, cons_opt) {
// Define accessors first, as this may fail and throw.
ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter,
set: StackTraceSetter,
configurable: true });
根据我的理解,由于stack是Error的一个属性,所以在调用supper()之后,就不需要在MyError类中调用captureStackTrace了。我错过了什么吗?
【问题讨论】:
-
浏览器还不太支持扩展内置类。 Babel 对此无能为力。
-
你真的只使用 chrome 吗?如果是这样,你可以使用原生 ES6 类并告诉 Babel 不要转译它们。然后扩展错误将起作用。
标签: javascript google-chrome exception ecmascript-6 babeljs