【JavaScript】独自のエラータイプで例外を発生させる方法

更新日:2024/03/15

今回は、独自のエラーオブジェクトを作成して、例外を発生させる方法をお伝えします。

 

JSのエラータイプ

JavaScriptで例外をスローするとき、Errorオブジェクトの他に次のNativeErrorオブジェクトと呼んでいるオブジェクトを利用できます。

EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError

プログラマーなら、よく目にする名前が含まれているので、イメージしやすいと思います。

これ以外のエラーを発生させるときは、Errorオブジェクトでメッセージ等を工夫して使用するのが一般的ですが、今回は独自なエラータイプで例外を発生させてみます。

 

独自エラータイプの作成方法

今回は、class構文を使用して、Errorオブジェクトを継承します。

NativeErrorオブジェクトは全て同じ構造を持っていて、唯一異なるのが prototypeのnameプロパティの値です。
ここに、"SyntaxError"や"TypeError"などの文字列がセットされていて、文字列化したときにエラー名として利用されます。

まずは、constructor()内のsuper()で引数をErrorオブジェクトに渡します。
次に、nameプロパティに、エラー名をセットします。

const MyApplicationError  = class extends Error{
  name = "MyApplicationError";
  constructor( message  , options ){
    super(  message  , options );
  }
};

これだけで、独自エラータイプの完成です。

しかし、一つ問題があります。
ErrorオブジェクトとNativeErrorオブジェクトは、newキーワードを指定しなくても、インスタンスを作成します。

class構文で生成したコンストラクターは、newキーワードを使用しないとエラーになるので、少し工夫が必要です。

そこで、次のように関数で受け取って、内部でクラスを生成して返します。
また、Error.prototype.messege等に対応するプロパティを関数に対応させるために、クラスのprototypeを関数にセットしています。

const MyApplicationError  =  (()=>{
     // クラス定義
  const classBody = class extends Error{
    name = "MyApplicationError";
    constructor( message  , options ){
      super(  message  , options );
    }
  };
     // インスタンスを生成して返す関数
  const func =  function( message  , options ){
    return new classBody( message  , options );
  };
    // 関数とクラスのprototype共有
  func.prototype=classBody.prototype; 

  return func;
})();

これで、newがある無しに関係なく、インスタンスを返すようになります。

 

テスト

Errorオブジェクトは実装サイドで、ECMAScript仕様で定義されていないプロパティを付加していることが多いです。
今回は、その中でも情報外多いと思われるFirefoxでテストしてみます。

テストコードは、try内でエラーをスローして、catch()で受けるだけです。

try{
  throw  new MyApplicationError( "エラーです" ,{ cause:"E001" });
}catch( e ){
  console.log( e );   // MyApplicationError: エラーです
    // エラータイプ確認(インスタンス確認)
  console.log( e instanceof MyApplicationError );  // true
}

ログには、"MyApplicationError: エラーです"と表示されました。
instanceofでのエラータイプ確認もできています。

DevToolを使用してcatch()で受け取った値の内容を確認すると、様々な情報が付加されています。

cause: "E001"
​columnNumber: 7
​​fileName: "file:///C:/test1.html"
​​lineNumber: 13
​​message: "エラーです"
​​name: "MyApplicationError"
​​stack: "classBody@file:///C:/test1.html:13:7\nfunc@file:///C:/test1.html:17:12\n@file:///C:/test1.html:24:10\n"

ErrorやNativeErrorオブジェクトはstackの内容がもっと短いのですが、その点を気にしなければ、ほぼError等のオブジェクトと同じ動作をする独自エラータイプになっていることが確認できました。

更新日:2024/03/15

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。