1. ホーム
  2. javascript

[解決済み] ES6構文とBabelでJavascriptのエラーを拡張する

2022-06-03 16:49:03

質問

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 .

また、Karel の例にはなかったエラーメッセージをスタックトレースに追加します。

また、この例では captureStackTrace も使用します。

Babel 6 では transform-builtin-extend ( npm ) で動作します。