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

我正在尝试用ES6和Babel扩展错误。它没有成功。

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 对象永远不会获得正确的消息集。

尝试在巴别尔REPL

现在我已经看到了一些关于SO的解决方案(例如这里),但它们似乎都非常不ES6-y。如何以一种漂亮的ES6方式做到这一点?(那是在巴别塔工作)


答案 1

根据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);

这将在堆栈中打印,而不是在通用 .MyErrorError

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

如果可用,它也将使用。captureStackTrace

在 Babel 6 中,您需要转换-内置-扩展npm) 才能实现此功能。


答案 2

结合这个答案这个答案这个代码,我做了这个小的“帮助器”类,它似乎工作正常。

class ExtendableError extends Error {
  constructor(message) {
    super();
    this.message = message; 
    this.stack = (new Error()).stack;
    this.name = this.constructor.name;
  }
}    

// now I can extend

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

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

在 REPL 中试用