「JavaScript/例外処理」の版間の差分

削除された内容 追加された内容
編集の要約なし
編集の要約なし
81 行
 
try文の後にはcatch文またはfinally文のいずれか、もしくは両方を置かなければなりません。catch文を除いたtry-finally文では、例外が発生してもしなくてもfinally文は実行されますが、catch文によって例外が捕捉されないので、例外が発生した場合は以降の処理を中断します。
 
==forEachからの脱出==
JavaScript 1.6で追加された[[JavaScript/Array/prototype/forEach|forEach]]メソッドを使用すると、次のようにして[[JavaScript/Array|配列]]の各要素について処理を行うことができます。
 
<source lang="javascript">
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
array.forEach(function(n){
if ( n == 5 ) {
alert(n); // "5" と表示
return; // でも抜けられない
}
});
</source>
 
この例では配列の中から 5 という数字を見つけて表示し、ループを抜けることを期待していますが、returnをしてもforEachメソッドによって呼ばれた無名関数から脱出するだけで、ループそのものは最後の 9 まで回ってしまいます。その分の処理に掛かる時間は無駄になってしまいます。
 
このような場合、try-catch文による例外処理を応用すると反復処理から抜け出すことができます。
 
<source lang="javascript">
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
try {
array.forEach(function(n){
if ( n == 5 ) {
alert(n); // "5" と表示
throw false; // 例外を投げる
}
});
}
catch (e) {
if (e) throw e; // もしfalseでない例外が発生していたら中断
}
 
// 以降の処理
</source>
 
こうすると、配列の中から 5 という値が見つかった時点で例外を発生し、forEachメソッドの反復を抜けるため、処理に掛かる時間を短縮することができます。このテクニックは非常によく用いられます。
 
catch節は単に見せかけの例外を捕捉するだけで、そのまま以降の処理を続けますが、もし本当に意図しない例外がtry節の中で発生していたときのために、<code>throw false;</code>で投げた例外<code>e</code>が<code>false</code>になっていない場合(<code>true</code>の場合)は実際に例外を発生させるようにしています。
 
[[Category:JavaScript|れいかいしより]]