JavaScriptでの例外処理について整理する

JavaScriptにおける例外処理の特徴に着目して整理する。

例外オブジェクト

下記に引用する[1]「6.16 throw 文」の記述から、JavaScriptにおける例外は任意のデータ型であることがわかる。

throw 文の書式は次の通りです。
 throw expression;
expression に指定する式が返す値には、型の制限はありません。
ただし、普通は Error オブジェクトか、 Error クラスのサブクラスのインスタンスを返すようにします。また、エラーメッセージを含む文字列や、エラーコードを表す数値を返すようにしてもかまいません。

とはいえ、下記に引用する[2]「4.6 例外」にもあるように、 name と message のフィールドをもつオブジェクトを投げるのが作法のようだ。

そして throw 文には例外オブジェクトを渡すべきである。その中には、例外のタイプを特定できるような name プロパティと、状況を説明した message プロパティを含めるとよい。

なお、Javaとは異なり、try句とcatch句は1対1の関係である。
そのため、例外の種類によって処理を分岐させたい場合は、例外の name プロパティで判別したり、 Error をプロトタイプにもつ例外を各種定義して instanceof 演算子により判別したりが必要である。

try-catch の性能への影響

下記に引用する[3]「7.1.2 スコープチェーンの拡張」にあるように、catch節は性能面で懸念がある。
そのため、catch節には必要最低限の処理のみを記述することはもちろん、(何度も呼び出されると考えられる)下流の部分では例外を補足せずに、上流の最後の最後に補足すべきと考えられる。

catch 節は with 句と同様、ブロック内のコードが実行されている間、スコープチェーンの先頭に変数オブジェクトを追加します。この変数オブジェクトには、catch で指定された名前付きの例外オブジェクトのエントリが含まれています。ただ catch 節は try 節の実行中にエラーが発生したときだけ実行されうため、 with 文ほど大きな問題にはなりません。それでも、性能への影響を最小限に抑えるために、 catch 節ではあまりに長大なコードは実行しないように気をつけるべきです。

参考文献

[1]

JavaScript 第5版

JavaScript 第5版

[2]
JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

[3]
続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス

続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス