【问题标题】:Stack cannot be output for custom error with super() called under Babel?在 Babel 下调用 super() 的自定义错误无法输出堆栈?
【发布时间】: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代码,Errorstack

captureStackTrace = function captureStackTrace(obj, cons_opt) {
  // Define accessors first, as this may fail and throw.
  ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter,
                                       set: StackTraceSetter,
                                       configurable: true });

根据我的理解,由于stackError的一个属性,所以在调用supper()之后,就不需要在MyError类中调用captureStackTrace了。我错过了什么吗?

【问题讨论】:

  • 浏览器还不太支持扩展内置类。 Babel 对此无能为力。
  • 你真的只使用 chrome 吗?如果是这样,你可以使用原生 ES6 类并告诉 Babel 不要转译它们。然后扩展错误将起作用。

标签: javascript google-chrome exception ecmascript-6 babeljs


【解决方案1】:

据我所知,为了在 V8 中正确扩展 Error 类,您应该调用

Error.captureStackTrace(this, this.constructor)

在它的构造函数中,例如:

class MyError extends Error {
  constructor (message) {
    super()
    Error.captureStackTrace(this, this.constructor)
    Object.assign(this, {name: 'MyError', message})
  }
}

注意:请记住,并非所有浏览器都支持Error.captureStackTrace,因此您可能必须将其设为可选。

或者,您可以使用es6-error npm module 自动处理所有这些内容:

import ExtendableError from 'es6-error';

class MyError extends ExtendableError {
  // everything is taken care of
}

【讨论】:

  • 由于super()是在MyError子类中调用的,我认为没有必要调用captureStackTrace。请查看我的问题更新。
  • @zangw Error.captureStackTraceV8 Stack Trace API 的一部分,无法避免。调用 supper() 不足以正确扩展 V8 错误类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2018-11-11
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多