使用 ES6 语法和 Babel 扩展 Javascript 中的错误

2023-12-07

我正在尝试使用 ES6 和 Babel 来扩展 Error。它没有成功。

class MyError extends Error {
  constructor(m) {
    super(m);
  }
}

var error = new Error("ll");
var myerror = new MyError("ll");
console.log(error.message) //shows up correctly
console.log(myerror.message) //shows empty string

Error 对象永远不会获得正确的消息集。

尝试 Babel REPL.

现在我已经看到了一些关于SO的解决方案(例如这里),但它们看起来都非常不符合 ES6 风格。如何以漂亮的 ES6 方式做到这一点? (那是在 Babel 中工作)


根据 Karel Bílek 的回答,我会对constructor:

class ExtendableError extends Error {
  constructor(message) {
    super(message);
    this.name = this.constructor.name;
    if (typeof Error.captureStackTrace === 'function') {
      Error.captureStackTrace(this, this.constructor);
    } else { 
      this.stack = (new Error(message)).stack; 
    }
  }
}    

// now I can extend

class MyError extends ExtendableError {}

var myerror = new MyError("ll");
console.log(myerror.message);
console.log(myerror instanceof Error);
console.log(myerror.name);
console.log(myerror.stack);

这将打印MyError在堆栈中,而不是通用的Error.

它还会将错误消息添加到堆栈跟踪中 - 卡雷尔的示例中缺少该消息。

它还将使用captureStackTrace如果有的话。

使用 Babel 6,你需要变换内置扩展 (npm)为此工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ES6 语法和 Babel 扩展 Javascript 中的错误 的相关文章

随机推荐