0x0b
js_about_04
最終更新:
0x0b
-
view
文
ブロック文(Block Statement)
ブロック文は文をグループ化するのに用います。ブロックは波括弧のペアで区切ります。
{ statement_1 statement_2 . . . statement_n }
例
ブロック文は一般に制御フロー文(例:if、for、while)で用いられます。
ブロック文は一般に制御フロー文(例:if、for、while)で用いられます。
while (x < 10) { x++; }
ここでは { x++; } がブロック文です。
重要:JavaScript にはブロックスコープがありません。ブロックを用いて導入された変数のスコープは、そのブロックがある関数やスクリプトになります。変数をセットする影響はそのブロックを越えて持続されます。つまり、ブロック文はスコープを持ち込まないということです。独立したブロックも構文的には正しいのですが、C や Java のブロックで果たされるような機能を期待しているのであれば、そのような機能は果たされないため、JavaScript で独立したブロックを使う必要はありません。
var x = 1; { var x = 2; } alert(x); // 2 を出力
ブロック内の var x 文はブロック前の var x 文と同じスコープ内であるため、この例では 2 が出力されます。C や Java では相当のコードは 1 を出力します。
条件文(Conditional Statements)
条件文は指定した条件が true ならば実行されるコマンドのセットです。JavaScript は if...else と switch の 2 つの条件文をサポートしています。
if...else 文
ある論理条件が true ならばある文を実行したいというときには if 文を使用してください。オプション的な else 節を使用すると、条件が false の場合にある文を実行することができます。if 文は次のように使用します。
ある論理条件が true ならばある文を実行したいというときには if 文を使用してください。オプション的な else 節を使用すると、条件が false の場合にある文を実行することができます。if 文は次のように使用します。
if (condition) statement_1 [else statement_2]
condition には true か false に評価される式が入ります。condition が true に評価された場合は statement_1 が実行され、そうでない場合は statement_2 が実行されます。statement_1 と statement_2 はどんな文でもかまいません。if 文をさらに入れ子にすることもできます。
次のように else if を使用して文を重ねることで複数の条件を順々にテストさせることができます。
if (condition) statement_1 [else if (condition_2) statement_2] ... [else if (condition_n_1) statement_n_1] [else statement_n]
複数の文を実行させるには、ブロック文 ({ ... }) を使用してその文をグループ化してください。一般に常にブロック文を使用するのが優れた方法です。特に if 文を入れ子にしたコードでは有効です。
if (condition) { statements_1 } else { statements_2 }
条件式では単純な代入は使わないようにしてください。コードをちらっと見たときに、代入を等価条件と見間違えるおそれがあるためです。例えば次のようなコードは使用しないでください。
if (x = y) { /* 正しいことをする */ }
条件式で代入を使う必要がある場合に一般的な方法として代入式をさらに括弧でくくるというものがあります。
if ((x = y)) { /* 正しいことをする */ }
プリミティブな真偽値の true と false を Boolean オブジェクトの true や false という値と混同しないでください。undefined や、null、0、NaN、空文字列 ("") でないどんな値も、そして false という値を持つ Boolean オブジェクトを含むどんなオブジェクトも、条件文に通されると true に評価されます。
var b = new Boolean(false); if (b) // この条件は true に評価される
例
次の例では、関数 checkData は Text オブジェクトに含まれている文字数が 3 の場合に true を返し、そうでない場合はアラートを表示して false を返します。
次の例では、関数 checkData は Text オブジェクトに含まれている文字数が 3 の場合に true を返し、そうでない場合はアラートを表示して false を返します。
function checkData() { if (document.form1.threeChar.value.length == 3) { return true; } else { alert("Enter exactly three characters. " + document.form1.threeChar.value + " is not valid."); return false; } }
switch 文
switch 文を使うと、プログラムは式を実行し、式の値を case ラベルにマッチさせます。マッチすると、プログラムは結びつけられた文を実行します。switch 文は次のように使用します。
switch 文を使うと、プログラムは式を実行し、式の値を case ラベルにマッチさせます。マッチすると、プログラムは結びつけられた文を実行します。switch 文は次のように使用します。
switch (expression) { case label_1: statements_1 [break;] case label_2: statements_2 [break;] ... default: statements_def [break;] }
プログラムはまず式の値にマッチしたラベルを持つ case 節を探します。そしてコントロールをその節に移し、結びつけられた文を実行します。マッチしたラベルがない場合、プログラムはオプション的な default 節を探し、あった場合はその節にコントロールを移し、結びつけられた文を実行します。default 節がなかった場合、プログラムは switch 文の後に続く文を実行し続けます。慣例により、default 節は最後の節にします。しかしそうしなければいけないわけではありません。
各 case 節に結びつけられたオプション的な break 文は、一度マッチした文を実行したら switch から抜け、switch に続く文を実行し続けることを確実にするものです。break を省略した場合、その switch 文における次の文を実行し続けます。
例
次の例では、fruittype が "Bananas" に評価された場合、"Bananas" という場合にマッチし、それに結びつけられた文が実行されます。break に出くわすとプログラムは switch から抜け、switch の後に続く文を実行します。break を省略すると "Cherries" という場合の文も実行されます。
次の例では、fruittype が "Bananas" に評価された場合、"Bananas" という場合にマッチし、それに結びつけられた文が実行されます。break に出くわすとプログラムは switch から抜け、switch の後に続く文を実行します。break を省略すると "Cherries" という場合の文も実行されます。
switch (fruittype) { case "Oranges": document.write("Oranges are $0.59 a pound.<br>"); break; case "Apples": document.write("Apples are $0.32 a pound.<br>"); break; case "Bananas": document.write("Bananas are $0.48 a pound.<br>"); break; case "Cherries": document.write("Cherries are $3.00 a pound.<br>"); break; case "Mangoes": case "Papayas": document.write("Mangoes and papayas are $2.79 a pound.<br>"); break; default: document.write("Sorry, we are out of " + fruittype + ".<br>"); } document.write("Is there anything else you'd like?<br>");
ループ文(Loop Statements)
ループは指定した条件が満たされている限り繰り返し実行されるコマンドのセットです。JavaScript は、label はもちろん、for、do while、while といったループ文をサポートしています(label 自体はループ文ではありませんが、これらの文とともに頻繁に使用されます)。さらに、break および continue 文をループ文の中で使うことができます。
さらに for...in 文も文を繰り返し実行しますが、これはオブジェクトの操作に使用します。オブジェクト操作文 をご覧ください。
ループ文は以下のとおりです。
- for 文
- do...while 文
- while 文
- label 文
- break 文
- continue 文
for文
for ループは指定した条件が false に評価されるまで繰り返します。JavaScript の for ループは Java や C の for ループに似ています。for 文は次のように使用します。
for ([initialExpression]; [condition]; [incrementExpression]) statement for ループを実行すると以下のことが起こります。
1.初期化式 initialExpression があれば実行されます。この式は通常、1 つかそれ以上のループカウンタを初期化しますが、構文的にはある程度複雑な式も指定できます。また、この式は変数を宣言することもできます。
2.condition 式が評価されます。condition の値が true であればループ文が実行されます。condition が false の場合は for ループは終了します。condition 式が完全に省略されている場合、条件は true であると仮定されます。
3.statement が実行されます。複数の式を実行するにはブロック文 ({ ... }) を使用して文をグループ化してください。
4.更新式 incrementExpression があれば実行されます。そしてコントロールがステップ 2 に戻ります。
例
次の関数には、スクローリングリスト(複数選択できる Select オブジェクト)で選択されたオプションの数を数える for 文が含まれています。for 文では変数 i が宣言され、それが 0 に初期化されています。i が Select オブジェクトのオプションの個数より小さいかをチェックし、続く if 文を実行し、ループが 1 回りしたら i を 1 だけ増加させます。
2.condition 式が評価されます。condition の値が true であればループ文が実行されます。condition が false の場合は for ループは終了します。condition 式が完全に省略されている場合、条件は true であると仮定されます。
3.statement が実行されます。複数の式を実行するにはブロック文 ({ ... }) を使用して文をグループ化してください。
4.更新式 incrementExpression があれば実行されます。そしてコントロールがステップ 2 に戻ります。
例
次の関数には、スクローリングリスト(複数選択できる Select オブジェクト)で選択されたオプションの数を数える for 文が含まれています。for 文では変数 i が宣言され、それが 0 に初期化されています。i が Select オブジェクトのオプションの個数より小さいかをチェックし、続く if 文を実行し、ループが 1 回りしたら i を 1 だけ増加させます。
<script type="text/javascript">//<![CDATA[ function howMany(selectObject) { var numberSelected = 0; for (var i = 0; i < selectObject.options.length; i++) { if (selectObject.options[i].selected) numberSelected++; } return numberSelected; } //]]></script> <form name="selectForm"> <p> <strong>Choose some music types, then click the button below:</strong> <br/> <select name="musicTypes" multiple="multiple"> <option selected="selected">R&B</option> <option>Jazz</option> <option>Blues</option> <option>New Age</option> <option>Classical</option> <option>Opera</option> </select> </p> <p> <input type="button" value="How many are selected?" onclick="alert ('Number of options selected: ' + howMany(document.selectForm.musicTypes))"/> </p> </form>
do...while 文
do...while 文は指定した条件が false に評価されるまで繰り返します。do...while 文は次のように使用します。
do statement while (condition);
statement は条件がチェックされる前に一度実行されます。複数の文を実行するにはブロック文 ({ ... }) を使用して文をグループ化してください。condition が true の場合、その文が再び実行されます。毎回実行された後に条件がチェックされます。条件が false ときは実行が停止され、コントロールが do...while の後に続く文に渡されます。
例
次の例では do ループは最低 1 回は反復され、i が 5 より小さくなくなるまで反復されます。
次の例では do ループは最低 1 回は反復され、i が 5 より小さくなくなるまで反復されます。
do { i += 1; document.write(i); } while (i < 5);
while 文
while 文は、指定した条件が true に評価される限り文を実行します。while 文は次のように使用します。
while (condition) statement
条件が false になるとループ内の statement の実行が停止し、ループの後に続く文にコントロールが渡されます。
ループの statement を実行する前に条件がテストされます。条件が true を返すと statement が実行され、再び条件がテストされます。条件が false を返すと、実行が停止され、while の後に続く文にコントロールが渡されます。
複数の文を実行するにはブロック文 ({ ... }) を用いて文をグループ化してください。
例 1
次の while ループでは n が 3 より小さい限り反復されます。
次の while ループでは n が 3 より小さい限り反復されます。
n = 0; x = 0; while (n < 3) { n++; x += n; }
それぞれの反復で、ループは n をインクリメントし、その値を x に加えています。その結果、x と n は次の値をとります。
第 1 段階終了後:n = 1、x = 1
第 2 段階終了後:n = 2、x = 3
第 3 段階終了後:n = 3、x = 6
第 3 段階が完了すると条件 n < 3 が true ではなくなっているため、ループは終了します。
第 2 段階終了後:n = 2、x = 3
第 3 段階終了後:n = 3、x = 6
第 3 段階が完了すると条件 n < 3 が true ではなくなっているため、ループは終了します。
例 2
無限ループは避けてください。ループの条件が最終的には false になることを確認してください。そうしないとループが終了しなくなります。次の while ループ内の文は永久に実行されます。条件が決して false にならないためです。
無限ループは避けてください。ループの条件が最終的には false になることを確認してください。そうしないとループが終了しなくなります。次の while ループ内の文は永久に実行されます。条件が決して false にならないためです。
while (true) { alert("Hello, world"); }
label 文
label を使うと、そのプログラムのどこからでも参照できる、識別子を持った文を作ることができます。例えば、ラベルを使用してあるループに名前を付けると、break 文や continue 文を使用してプログラムがループを脱出するべきかそのまま実行を継続するべきかを示すことができます。
label 文は次のように使用します。
label : statement
label の値は予約語でなければどんな JavaScript の識別子でも使用できます。ラベルを用いて名前を付ける statement はどんな文でも結構です。
例
この例では markLoop というラベルを用いて while ループに名前を付けています。
この例では markLoop というラベルを用いて while ループに名前を付けています。
markLoop: while (theMark == true) doSomething(); }
break 文
break 文
break 文は loop 文や switch 文、label 文から抜け出すために使用します。
break にラベルを使用しないと、最も内側にある while や do-while、for、switch から抜け、続く文にコントロールを移します。
break にラベルを使用すると、指定されたラベルの付いた文から抜けます。
break 文は次のように使用します。
break にラベルを使用すると、指定されたラベルの付いた文から抜けます。
break 文は次のように使用します。
break; break label;
1番目の形式の構文は最も内側のループもしくは switch から抜けます。2番目の形式の構文は指定した label 文から抜けます。
例
次の例は、その値が theValue である要素のインデックスが見つかるまで、配列の要素について繰り返します。
次の例は、その値が theValue である要素のインデックスが見つかるまで、配列の要素について繰り返します。
for (i = 0; i < a.length; i++) { if (a[i] == theValue) break; }
continue 文
continue 文は while 文、do-while 文、for 文、label 文をリスタートさせるために用います。
ラベルを用いずに continue を使用した場合、現在繰り返している最も内側にある while 文 do-while 文、for 文を終了し、次の反復の実行に移ります。break 文とは異なり、continue はループ全体の実行を終了しません。while ループでは条件比較部分に戻ります。for ループではインクリメントの式に移ります。
ラベルを用いて continue を使用した場合、label で指定されたループ文に移ります。
continue 文は次のように使用します。
ラベルを用いて continue を使用した場合、label で指定されたループ文に移ります。
continue 文は次のように使用します。
continue continue label
例 1
次の例では、i の値が 3 のときに実行される continue 文を用いた while ループを示します。こうすることで n は順に 1、3、7、12 という値をとります。
次の例では、i の値が 3 のときに実行される continue 文を用いた while ループを示します。こうすることで n は順に 1、3、7、12 という値をとります。
i = 0; n = 0; while (i < 5) { i++; if (i == 3) continue; n += i; }
例 2
checkiandj というラベルの付いた文の中に checkj というラベルの付いた文があります。continue に出くわすと、プログラムは checkj の現在の反復を終了し、次の反復を始めます。continue に出くわすたびに、条件が false になるまで checkj を繰り返します。false が返されると checkiandj 文の残りを完了し、条件が false を返すまで checkiandj を繰り返します。false が返されると checkiandj に続く文が実行されます。
checkiandj というラベルの付いた文の中に checkj というラベルの付いた文があります。continue に出くわすと、プログラムは checkj の現在の反復を終了し、次の反復を始めます。continue に出くわすたびに、条件が false になるまで checkj を繰り返します。false が返されると checkiandj 文の残りを完了し、条件が false を返すまで checkiandj を繰り返します。false が返されると checkiandj に続く文が実行されます。
continue が checkiandj というラベルを持っているとプログラムは checkiandj 文の最初から続けます。
checkiandj : while (i < 4) { document.write(i + "<br/>"); i += 1; checkj : while (j > 4) { document.write(j + "<br/>"); j -= 1; if ((j % 2) == 0) continue checkj; document.write(j + " is odd.<br/>"); } document.write("i = " + i + "<br/>"); document.write("j = " + j + "<br/>"); }
オブジェクト操作文(Object Manipulation Statements)
JavaScript はオブジェクトの操作に for...in、for each...in および with 文を使用します。
for...in 文
for...in 文は指定した変数をオブジェクトの全プロパティに対して反復します。それぞれのプロパティに対して JavaScript は指定した文を実行します。for...in 文は次のように使用します。
for...in 文は指定した変数をオブジェクトの全プロパティに対して反復します。それぞれのプロパティに対して JavaScript は指定した文を実行します。for...in 文は次のように使用します。
for (variable in object) { statements }
例
次の関数は、あるオブジェクトとそのオブジェクトの名前を引数にとります。そしてそのオブジェクトの全プロパティに対して反復し、プロパティ名とその値のリストにした文字列を返します。
次の関数は、あるオブジェクトとそのオブジェクトの名前を引数にとります。そしてそのオブジェクトの全プロパティに対して反復し、プロパティ名とその値のリストにした文字列を返します。
function dump_props(obj, obj_name) { var result = ""; for (var i in obj) { result += obj_name + "." + i + " = " + obj[i] + "<br>"; } result += "<hr>"; return result; }
make および model というプロパティを持つ car というオブジェクトでは次のような結果が得られます。
car.make = Ford car.model = Mustang
配列
Array の要素に対して反復する方法としてこれを用いることは魅力的かもしれませんが、for...in 文はその配列の要素に加えてユーザ定義プロパティに対して繰り返すため、独自のプロパティやメソッドを追加するなどして Array オブジェクトに変更を加えると for...in 文は数値のインデックスに加えてユーザ定義プロパティの名前を返します。したがって、配列に対して反復したいときには数値のインデックスを用いた従来の for ループを使用したほうがいいでしょう。
Array の要素に対して反復する方法としてこれを用いることは魅力的かもしれませんが、for...in 文はその配列の要素に加えてユーザ定義プロパティに対して繰り返すため、独自のプロパティやメソッドを追加するなどして Array オブジェクトに変更を加えると for...in 文は数値のインデックスに加えてユーザ定義プロパティの名前を返します。したがって、配列に対して反復したいときには数値のインデックスを用いた従来の for ループを使用したほうがいいでしょう。
for each...in 文
for each...in は JavaScript 1.6 で導入されるループ文です。これは for...in に似ていますが、オブジェクトのプロパティの名前ではなく、プロパティの値に対して反復します。
for each...in は JavaScript 1.6 で導入されるループ文です。これは for...in に似ていますが、オブジェクトのプロパティの名前ではなく、プロパティの値に対して反復します。
with 文
with 文はデフォルトのオブジェクトについて文のセットを実行します。JavaScript はその文のセットにおいて非修飾名を検索し、その名前がデフォルトのオブジェクトのプロパティであるかを決定します。非修飾名がプロパティにマッチすると、そのプロパティがその文で使われます。そうでない場合はローカル変数かグローバル変数が使われます。
with 文はデフォルトのオブジェクトについて文のセットを実行します。JavaScript はその文のセットにおいて非修飾名を検索し、その名前がデフォルトのオブジェクトのプロパティであるかを決定します。非修飾名がプロパティにマッチすると、そのプロパティがその文で使われます。そうでない場合はローカル変数かグローバル変数が使われます。
with 文は次のように使用します。
with (object) { statements }
例
次の with 文では Math オブジェクトがデフォルトのオブジェクトに指定されています。with 文内の文は PI プロパティや cos および sin メソッドを参照していますが、オブジェクトは指定していません。JavaScript はこれらの参照は Math オブジェクトへのものであると想定します。
次の with 文では Math オブジェクトがデフォルトのオブジェクトに指定されています。with 文内の文は PI プロパティや cos および sin メソッドを参照していますが、オブジェクトは指定していません。JavaScript はこれらの参照は Math オブジェクトへのものであると想定します。
var a, x, y; var r = 10; with (Math) { a = PI * r * r; x = r * cos(PI); y = r * sin(PI/2); }
注意:with 文を使うことでプログラムをより簡潔にすることができますが、with の不適切な使用はプログラムを大幅にスローダウンさせることに繋がります。Core JavaScript 1.5 Reference:Statements:with を参照してください。
コメント
コメントはスクリプトの挙動を説明するメモに用います。コメントはインタプリタには無視されます。JavaScript は Java および C++ 形式のコメントをサポートしています。
1 行だけのコメントは 2 重のスラッシュ (//) から始まる。
複数行にまたがるコメントは /* から始まり */ で終わる。
例
以下に 2 つのコメントの例を示します。
複数行にまたがるコメントは /* から始まり */ で終わる。
例
以下に 2 つのコメントの例を示します。
// これは 1 行コメント。 /* これは複数行コメント。どんな長さでもかまわない。
書きたいことを何でもここに書ける。 */
例外処理文(Exception Handling Statements)
throw 文を使用すると例外を投げることができます。また、try...catch 文を使用すると例外を処理することができます。
try...catch 文を使用して Java の例外を処理することもできます。この情報については JavaScript での Java の例外の処理 および Java と JavaScript との通信 をご覧ください。
throw 文
try...catch 文
例外の種類
try...catch 文
例外の種類
JavaScript ではほとんどどんなオブジェクトでも投げることができます。とは言っても、必ずしもすべての投げられたオブジェクトが同等に作られているわけではありません。数値や文字列をエラーとして投げる方法はよく用いられますが、特にこの用途のために作られている例外の種類のうちのどれかを使用したほうがより効率的であることがよくあります。
ECMAScript の例外
- Error
- EvalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
DOM の例外
- DOMException
- EventException
- RangeException
- ... (?)
- nsIXPCException (XPConnect)
throw 文
throw 文は例外を投げるために使用します。例外を投げるときは、投げたい値からなる式を指定してください。
throw expression;
特定の型の式だけではなく、あらゆる式を投げることができます。下記のコードは様々な型の例外を投げています。
throw "Error2"; throw 42; throw true; throw {toString: function() { return "I'm an object!"; } };
注意:例外を投げる際にオブジェクトを指定することができます。すると、catch ブロックでそのオブジェクトのプロパティを参照できるようになります。次の例では UserException という種類の myUserException というオブジェクトを作ります。また、このオブジェクトを throw 文で使用します。
// UserException という種類のオブジェクトを作成 function UserException (message) { this.message=message; this.name="UserException"; } // 文字列として使用されるとき(例:エラーコンソール上)に // 例外を整形する UserException.prototype.toString = function () { return this.name + ': "' + this.message + '"'; } // そのオブジェクトの種類のインスタンスを作成し、それを投げる throw new UserException("Value too high");
try...catch 文
try...catch 文はテストしたい文のブロックを指定し、さらに投げられるであろう例外に対する 1 つ以上の対処方法を指定します。例外が投げられると try...catch 文がそれを受け取ります。
try...catch 文は 1 つの try ブロックと 0 個以上の catch ブロックからなります。前者は 1 つ以上の文からなります。後者は try ブロックで例外が投げられた場合にどうするかを指定する文からなります。すなわち、成功させたい try ブロックと、失敗した場合にコントロールを渡す catch ブロックからなります。try ブロック内(もしくは try ブロック内から呼び出された関数内)のいずれかの文が例外を投げた場合、コントロールはすぐに catch ブロックに移ります。try ブロックで例外が投げられなかった場合は catch ブロックは飛ばされます。finally ブロックは try および catch ブロックが実行された後に実行されます。ただし try...catch 文の後に続く文より先に実行されます。
次の例では try...catch 文を使用しています。この例では渡された値に基づいて配列から月の名前を取り出す関数を呼び出します。値に対応する月の数字 (1-12) がなかったら、InvalidMonthNo という値を持つ例外が投げられ、catch ブロックの中の文は monthName という変数に unknown という値をセットします。
function getMonthName (mo) { mo=mo-1; // 月の数字を配列のインデックスに合わせる (1=Jan, 12=Dec) var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul", "Aug","Sep","Oct","Nov","Dec"); if (months[mo] != null) { return months[mo] } else { throw "InvalidMonthNo" } } try { // テストする文 monthName=getMonthName(myMonth) // 関数は例外を投げることがある } catch (e) { monthName="unknown" logMyErrors(e) // 例外オブジェクトをエラー処理部分に渡す }
catch ブロック
単一の catch ブロックを使用すると、try ブロックで生じうるすべての例外を扱うことができます。また、扱う例外の種類によって catch ブロックをそれぞれに分けることもできます。
単一の catch ブロックを使用すると、try ブロックで生じうるすべての例外を扱うことができます。また、扱う例外の種類によって catch ブロックをそれぞれに分けることもできます。
単一の catch ブロック
try ブロックで投げられるいかなる例外にも対応したエラー処理コードを実行するには、try...catch 文で catch を 1 つ使用してください。
try ブロックで投げられるいかなる例外にも対応したエラー処理コードを実行するには、try...catch 文で catch を 1 つ使用してください。
単一の catch ブロックは次のように使用します。
catch (catchID) { statements }
catch ブロックは、throw 文で指定された値を持つ識別子(上記の構文における catchID)を指定します。この識別子を使用することで投げられた例外についての情報を得ることができます。JavaScript は catch ブロックに入るときにこの識別子を作成します。識別子は catch ブロックにいる間だけ持続します。つまり、catch ブロックの実行が終了するとその識別子はもう使えなくなります。
例えば、次のコードは例外を投げます。例外が生じるとコントロールが catch ブロックに移ります。
try { throw "myException" // 例外を生成 } catch (e) { // どんな例外も扱う文 logMyErrors(e) // 例外オブジェクトをエラー処理部分に渡す }
複数の catch ブロック
1 つの try 文に対して、複数の条件についての catch ブロックを使うことができます。そして、そのそれぞれがそれぞれの種類の例外を担当します。この場合、そのブロックで指定されている例外が投げられたときだけ、適切な条件の catch ブロックに入ることになります。すべての未指定の例外のために、すべての例外に対応した catch ブロックをその文の最後の catch ブロックとしてオプション的に設けることもできます。
1 つの try 文に対して、複数の条件についての catch ブロックを使うことができます。そして、そのそれぞれがそれぞれの種類の例外を担当します。この場合、そのブロックで指定されている例外が投げられたときだけ、適切な条件の catch ブロックに入ることになります。すべての未指定の例外のために、すべての例外に対応した catch ブロックをその文の最後の catch ブロックとしてオプション的に設けることもできます。
例えば、次の関数は 3 つの別の関数(どこかで定義済み)を呼び出します。この関数はその引数が妥当であるかを確かめます。妥当性確認関数が確認対象の構成要素が妥当でないと決定した場合、その関数は 0 を返し、該当する例外を呼び出し元に投げさせます。
function getCustInfo(name, id, email) { var n, i, e; if (!validate_name(name)) throw "InvalidNameException" else n = name; if (!validate_id(id)) throw "InvalidIdException" else i = id; if (!validate_email(email)) throw "InvalidEmailException" else e = email; cust = (n + " " + i + " " + e); return (cust); }
おのおのの条件の catch ブロックは適当な例外処理部分にコントロールを渡します。
try { // 関数は 3 つの例外を投げうる getCustInfo("Lee", 1234, "lee@netscape.com") } catch (e if e == "InvalidNameException") { // 不正な名前に対しての処理部分を呼び出す bad_name_handler(e) } catch (e if e == "InvalidIdException") { // 不正な ID に対しての処理部分を呼び出す bad_id_handler(e) } catch (e if e == "InvalidEmailException") { // 不正なメールアドレスに対しての処理部分を呼び出す bad_email_handler(e) } catch (e){ // 何が起きるかはわからないが、そのログをとる logError(e) }
finally ブロック
finally ブロックは、try および catch ブロックの実行が終わった後に実行される文からなります。ただし try...catch 文の後に続く文より前に実行されます。finally ブロックは例外が投げられても投げられなくても実行されます。例外が投げられた場合、finally ブロック内の文はたとえ例外処理をする catch ブロックがなくても実行されます。
finally ブロックは、try および catch ブロックの実行が終わった後に実行される文からなります。ただし try...catch 文の後に続く文より前に実行されます。finally ブロックは例外が投げられても投げられなくても実行されます。例外が投げられた場合、finally ブロック内の文はたとえ例外処理をする catch ブロックがなくても実行されます。
finally ブロックを使用することで、例外発生時に適切にスクリプトを停止させることができます。例えば、スクリプトで使用していたリソースを解放する必要があるかもしれません。次の例ではファイルを開き、そのファイルを使用する文を実行します(サーバサイド JavaScript ではファイルにアクセスできます)。ファイルを開いている間に例外が投げられると、スクリプトが停止する前に finally ブロックがそのファイルを閉じます。
openMyFile(); try { writeMyFile(theData); // エラーを投げる可能性がある }catch(e){ handleError(e); // エラーを受け取り、それを処理する }finally { closeMyFile(); // 常にリソースを閉じる } try...catch 文のネスト 1 つ以上の try...catch 文を入れ子にすることができます。内側の try...catch 文に catch ブロックがない場合、囲んでいる try...catch 文の catch ブロックがマッチしているか確認されます。