Javascript 无法为自定义错误输出堆栈,在Babel下调用super()?
请参阅,ES6中的自定义错误可以写为:Javascript 无法为自定义错误输出堆栈,在Babel下调用super()?,javascript,google-chrome,exception,ecmascript-6,babeljs,Javascript,Google Chrome,Exception,Ecmascript 6,Babeljs,请参阅,ES6中的自定义错误可以写为: class MyError extends Error { constructor(message) { super(message); this.message = message; this.name = 'MyError'; } } 不需要this.stack=(new Error()).stack技巧 然而,我在下面测试它 没有堆栈信息,除非代码this.stack=(new Error()).stack或Erro
class MyError extends Error {
constructor(message) {
super(message);
this.message = message;
this.name = 'MyError';
}
}
不需要this.stack=(new Error()).stack由于super()
调用,代码>技巧
然而,我在下面测试它
没有堆栈信息,除非代码this.stack=(new Error()).stack
或Error.captureStackTrace(this,this.constructor.name)已调用代码>。
但是我在没有this.stack=(newerror()).stack的情况下测试了上面的代码段
或Error.captureStackTrace(this,this.constructor.name)代码>在Chrome控制台下
输出:
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)
根据我的理解,由于堆栈
是Error
的一个属性,在调用super()
之后,就没有必要在MyError
类中调用captureStackTrace
。我错过什么了吗 据我所知,为了正确扩展V8中的Error
类,您应该调用
Error.captureStackTrace(this,this.constructor)
在其构造函数中,例如:
类MyError扩展错误{
构造函数(消息){
超级()
Error.captureStackTrace(this,this.constructor)
赋值(这个,{name:'MyError',message})
}
}
N.B.:请记住,并非所有浏览器都支持Error.captureStackTrace
,因此您可能必须将其设置为可选
或者,您可以使用自动处理所有这些内容:
从“es6错误”导入ExtendableError;
类MyError扩展了ExtendableError{
//一切都搞定了
}
由于super()
是在MyError
子类中调用的,因此我认为没有必要调用captureStackTrace
。请查看我的问题更新。@zangw错误。captureStackTrace
是的一部分,无法避免。调用super()
不足以正确扩展V8错误类。浏览器中还不太支持重复扩展内置类。巴贝尔对此无能为力。你真的只是铬合金的吗?如果是这样,您可以使用本机ES6类并告诉Babel不要传输它们。然后扩展错误将起作用。
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)
captureStackTrace = function captureStackTrace(obj, cons_opt) {
// Define accessors first, as this may fail and throw.
ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter,
set: StackTraceSetter,
configurable: true });