Javascript 无法为自定义错误输出堆栈,在Babel下调用super()?

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

请参阅,ES6中的自定义错误可以写为:

class MyError extends Error {
  constructor(message) {
    super(message);
    this.message = message;
    this.name = 'MyError';
  }
}
不需要
this.stack=(new Error()).stacksuper()
调用,代码>技巧

然而,我在下面测试它

没有堆栈信息,除非代码
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 });