JavaScript try-catch文

出典: フリー教科書『ウィキブックス(Wikibooks)』
移動: 案内検索

例外処理[編集]

この項では、try~catch文を柱とした例外処理を学習する。

try~catch文[編集]

try~catch文は、tryに続くブロック(複文)部分で囲んだプログラム中で、なんらかのエラーが発生したときに、catch節を使ってエラーの内容を受け取るものである。 デバッグ中に、そのバグの内容を受け取ることが出来るので、ここでエラーの内容をはき出す様にしておくと、バグの箇所を特定するのに大変役に立つ。

try{
  // 何らかのプログラム
}catch( e ){
  alert( e );  // バグの内容をダイアログで表示する
}

finally文[編集]

filally文は、通常try~catch文の後に続いて書く。 catch節と違い、エラーが発生してもしなくても呼び出されて処理を行い、try節で行った処理の終了処理を記述するのが主な用途である。

try{
  // 何らかのプログラム
}catch( e ){
  alert( e );  // バグの内容をダイアログで表示する
}finally{
        // 終了処理
}

(try節の後ろには、catch節かfinally節のいずれかがあれば良く、catch節は必ずしも必要ではない)

throw文[編集]

エラーの内容を呼び出し元に通知する。 通常は関数の中に書いてしまい

function f(){
  throw "error:cannot calculate";  // エラーの内容を記述する
}

の様にエラーの内容を通知する。 これは関数内部で起きたエラーを呼び出し元に通知する役目があり

function f1(){
  throw "error:cannot calculate";  // エラーの内容を記述する
}
function f2(){
  try{
    f1();
  }catch(e){
    alert(e);  // 関数f1で起きたエラーを受け取って表示
  }
}

の様にエラーを受け取って処理する。

反復的なメソッドへの応用[編集]

try〜catch文は反復的なメソッドから脱出する目的でも用いられる。以下は配列のそれぞれの要素に対して与えられた関数を適用するArray.prototype.forEachメソッドの例である。このようなメソッドではreturn文を使っても途中で反復から抜け出すことができないため、try〜catch文が応用される。

try {
    'title=JavaScript&action=edit'.split('&').forEach(function(pair){
        var splits = pair.split('=');
        var key    = splits.shift();
        var value  = splits.shift();
        if ( key == 'action' ) { // もし key が action であれば
            throw null; // 例外を throw
        }
    });
}
catch (e) { // 例外を catch
    // action があった場合の処理 ...
}

この例では 'key0=value0&key1=value1&...&keyn=valuen' の形をした文字列(キー/値ペア、key-value pairs)の中に 'action' というキーが存在するかどうかを確認する。

まず文字列を '&' で分割し、'key=value' の形をしたそれぞれのペアを取り出して、forEachメソッドで反復処理している。反復処理の中では、さらに 'key=value' を '=' で分割し、キーと値を取り出して 'action' というキーが存在するかどうかを確認している。

'action' というキーが存在した場合は例外を発生させ、それをforEachメソッドの外にあるtry〜catch文で捕捉することにより、キーの存在を確認したあと即座に反復処理から抜け出すことに成功している。try〜catch文をうまく応用し、無駄な反復を省いているのである。