Error オブジェクトの種類と独自例外オブジェクトの作成方法

公開日: : 最終更新日:2014/07/05 JavaScript ,

JavaScript で例外オブジェクトを扱ったことがなかったので、簡単な内容ですが例外オブジェクトの種類とその使い方をまとめてみました。

icatch-exception_2482521750_mini

photo credit: billjacobus1 via photopin cc

目次

1. Error オブジェクトと6つの例外オブジェクト

JavaScript では、例外を表すオブジェクトとして汎用的に用いる Error オブジェクトと、目的別に使用する6つの例外オブジェクトが定義されています。

Error – JavaScript | MDN からの引用になりますが、これらを表にまとめておきます。

Error 汎用的に用いる例外オブジェクト
EvalError `eval()` に関して発生するエラーを表す
RangeError 数値をあらわす変数又は引数が、その有効範囲外である場合に発生するエラーを表す
ReferenceError 不正な参照を読み出した場合に発生するエラーを表す
SyntaxError `eval()` 内のコードを評価中に発生する構文エラーを表す
TypeError 変数又は引数の型が有効でない場合に発生するエラーを表す
URIError encodeURI() 又は decodeURI() が不正な引数を渡された場合に発生するエラーを表す

EvalErrorSyntaxError の違いが分からなかったのですが、何となく ↓ のような切り分けなんだろうと勝手に推測しています。

  • EvalErroreval 実行時に発生したエラーを表す例外オブジェクト
  • SyntaxError → (eval に限らず)全体的に不適切な構文が存在した場合に使用する例外オブジェクト

他の言語と同様に JavaScript でも独自の例外オブジェクトを定義できますが、まずはこれらのオブジェクトで事が足りるのかを検討するのがいいかなと思います。

2. Error オブジェクトを継承した独自例外オブジェクトの作成方法

定義されている例外では要件を満たせない場合は独自の例外オブジェクトを定義します。

次は Error オブジェクトを継承した例外オブジェクトの定義です。
「入力された文字列の書式が不適切な場合に使用する」というサンプルの例外オブジェクトです。

オブジェクトの定義方法自体は他にもいろいろあると思いますが、一つの例として載せておきます。

/**
 * 入力された文字列の書式が不適切な場合に使用する例外オブジェクト。
 *
 * @param {String} message 例外エラーメッセージ。メッセージを指定しない場合はデフォルトのメッセージを設定する。
 */
var InputStringParserError = function(message) {
    this.name = "inputstringparser";
    this.message = message || "入力された文字列の書式が異なります。";
};

InputStringParserError.prototype = new Error();
InputStringParserError.prototype.constructor = InputStringParserError;

オブジェクトの定義例を以下の記事にまとめてみました。
よかったら参考にしてみてください。

3. 例外の投げ方と try-catch のスニペット

検索すればいっぱいヒットしますが、オブジェクト定義とセットでまとめておきたかったので載せておきます。

3-1. 例外を throw するコードスニペット

良い例が思いつかなかったのですが、文字列中にある「コロン」の数を確認するオブジェクトを作成しました。
次の仕様になっています。

  • 文字列にコロンが存在しない → false を返す
  • 文字列にコロンが1つだけ存在する → true を返す
  • 文字列にコロンが2つ以上存在する → InputStringParserError を throw する

コードはこんな感じに定義しました。

/**
 * 入力された文字列を解析するオブジェクト。
 *
 */
var InputStringParser = (function() {

    return {
        /**
         * 入力された文字列に「コロン」が1つだけ存在するかを問い合わせる。
         *
         * @param {String} input 入力された文字列
         * @return {Boolean} コロンが1つだけ存在する場合 true
         * @throws {InputStringParserError} コロンが複数ある場合
         */
        hasOneColon: function(input) {
            var indexOf = input.indexOf(":");
            if (indexOf <= 0) {
                return false;
            }

            var count = input.split(":").length;
            if (count != 2) {
                throw new InputStringParserError();
            }
            return true;
        }
    };
})();

3-2. 例外を catch するコードスニペット

上記の InputStringParser を使って「コロン」の数を確認する部分のスニペットは次の通りです。
発生した例外が InputStringParserError だった場合と、それ以外の場合分けをしています。

var inputString = $('#input-text').val();
try {
    if (InputStringParser.hasOneColon(inputString)) {
        // true だった場合の処理
    } else {
        // false だった場合の処理
    }
} catch (e if e instanceof InputStringParserError) {
    // InputStringParserError だった場合の処理
} catch (e) {
    fuga2();
    // InputStringParserError 以外だった場合の処理
}

4. その他の JavaScript に関する記事

その他の JavaScript に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-disappear_7186028511_mini-thumbnail

GoogleMapsAPIを使ってMarkerの表示と非表示を切り替える方法

GoogleMaps API(v3) を使って地図上に表示されている Marker を非表示にする方

記事を読む

icatch-plug_8436280178_mini-thumbnail

TwitterBootstrap3 用のバリデーションチェックプラグイン BootstrapValidator の導入から Live チェックまでを試してみた

BootstrapValidator は、TwitterBootstrap3 で構築したサイト用の

記事を読む

icatch-automatic_2714993937_mini-thumbnail

Grunt + QUnit + PhantomJS でテストを自動実行してくれる環境を構築する

先日投稿した GoogleMap サンプルのプロジェクトに Grunt の LiveReload を

記事を読む

icatch-checklist_4439276478_mini-thumbnail

BootstrapValidator の基本的なバリデーションを試すサンプルを作成しました

TwitterBootstrap3 用のバリデーションチェックプラグイン BootstrapVali

記事を読む

icatch-simcity_536954375_mini-thumbnail

GoogleMapsAPIを使ってMarkerを削除する方法

GoogleMaps API(v3) を使って地図上に表示されている Marker を削除する方法に

記事を読む

icatch-template_mini

Underscore.js の template と each を使って JSON から select タグを生成する

Underscore.js を使って、都道府県名を定義してある JSON から select タグを

記事を読む

icatch-darts_1543970905_mini-thumbnail

GoogleMapsAPIを使って緯度・経度からMarkerを作成する方法

GoogleMaps API(v3) を使って、指定した緯度・経度の地点に Marker を表示する

記事を読む

icatch-checkbox-147904_640

jQuery を使ってチェックボックスのチェックを付けたり外したりするコードスニペット

jQuery を使ってチェックボックスの ON/OFF を操作する方法ですが、以前実装したときのコー

記事を読む

icatch-googlemap_3384984991_mini-thumbnail

住所から GoogleMap を表示するサンプル

ここ直近の2プロジェクトで緯度・経度(もしくは住所)から GoogleMap を表示する要件がありま

記事を読む

icatch-pointer_7269926502_mini-thumbnail

GoogleMaps の JavaScript API (v3) を使って地図上に複数の Marker を表示するサンプル

これまで GoogleMaps API を使って Marker やら InfoWindow を表示す

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


− 7 = 一

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑