プログラムの実行中に例外(エラー)が発生した場合、通常はエラー内容を表示して実行を中断します。しかし、致命的なエラーでなければ、実行を中断せずに発生した例外に応じた処理を行いたいことがあります。
このような処理を例外処理と呼び、JavaScriptではtry-catch-finally構文を使って記述します。
try-catch-finnaly構文の書き方
1 2 3 4 5 6 7 |
try{ //処理 }catch(変数名){ //try節内でエラーが発生した際に実行される処理 }finally{ //最後に必ず実行される処理 } |
try節には例外が発生する可能性のある処理を記述します。try節で例外が発生した場合は処理を中断し、catch節に記述した処理が実行されます。
try節で発生した例外を受け取る仮引数の変数名は任意ですが、通常はe(「exception」の頭文字)を使います。
finally説は必ず実行される
また、finally節は例外処理が終わる際に必ず実行されます。try節で例外が発生しなかった場合も実行されます。このため、try節で例外が発生した場合はcatch節とfinally節を、例外が発生しなかった場合はtry節とfinally節を実行してtry構文を抜けます。
なお、catch節とfinally節は省略可能ですが、両方を省略することはできません。
サンプル
次の例は、try節で定義されていない関数f()を呼び出そうとして例外が発生したため、まずcatch節を実行し、最後にfinally節を実行しています。
1 2 3 4 5 6 7 |
try{ f(); //例外が発生したのでcatch節に処理が移行 }catch(e){ alert("エラーが発生しました。"); }finally{ alert("プログラムを終了します。"); //最後に実行される } |
throw文を使った例外処理の場合分け
throw文を使うと、明示的に例外を発生させることができます。これを使って、例外に応じた処理の場合分けを行うことができます。
次の例は2つ数について除算を行うプログラムです。JavaScriptでは0で除算をするとinfinityという特殊な数値になりますが、ここでは0による除算を行った場合には例外を発生させています。
また、数値以外で除算すると結果はNaNとなってしまうため、同様に例外を発生させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function div(a, b){ try{ if(a==0||b==0){ //0で除算した場合に例外"zerodivision"を発生 throw "zerodivision"; }else if(isNaN(a)||isNaN(b)){ //数値以外で除算した場合に例外"nan"を発生 throw "nan" }else{ //それ以外の場合は除算を行う alert(a/b); } }catch(e){ if(e=="zerodivision"){ //例外の判定 alert("0で除算したため終了します。"); //A } if(e=="nan"){ //例外の判定 alert("数値以外で除算したため終了します。"); //B } } } div(4,2); //2 div(4,0); //Aを実行 div(4,"f"); //Bを実行 |
0で除算をした場合、あるいは、数値以外で除算をした場合に明示的に例外を発生させ、throw文でそれぞれの例外名("zerodivision", "nan")をcatch節に渡します。
catch節では条件分岐を使って例外名に応じた処理を行っています。