try-catch文
4348 ワード
try-catch
文は、JavaScriptにおいて異常を処理するための標準的な方法である.基本的な文法は以下の通りです.try{
//
} catch(error){
//
}
try
ブロック内の任意のコードにエラーが発生した場合、直ちにコード実行プロセスを終了し、次いでcatch
ブロックを実行する.このとき、catch
ブロックはエラー情報を含むオブジェクトを受信する.この間違った相手を使いたくなくても名前をつけてください.このオブジェクトにはエラーメッセージが保存されているmessage
属性とエラータイプを保存するname
属性が含まれています.finally子文
try-catch
文では任意であるが、finally
サブルーチンが使用されると、そのコードはいずれも実行される.言い換えれば、try
文ブロック内のコードはすべて正常に実行され、finally
文は実行される.エラーでcatch
ステートメントブロックが実行された場合、finally
サブルーチンはまた実行されます.コードにfinally
の部分文が含まれている限り、try
またはcatch
の文ブロックにどんなコードが含まれているかに関わらず、return
の文さえも、finally
の部分文の実行を阻止しない.この関数を見てください.function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {
return 0;
}
}
この関数はtry-catch
文の各部分にreturn
文を置いています.表面的には、この関数を呼び出したら2
に戻ります.2
に戻るreturn
文はtry
文のブロックにあるので、この文を実行しても間違いがないです.しかし、最後にもう一つのfinally
節があるので、結果としてこのreturn
文は無視されます.つまり、この関数を呼び出したら0
に戻るしかない.finally
子文を削除すると、この関数は2
に戻ります.コードに
finally
のサブフレーズが含まれている限り、try
またはcatch
のステートメントブロックのreturn
のステートメントは無視されます.finally
子文が提供されるならば、catch
子文はオプションとなる(catch
またはfinally
のうちの一つがあれば良い).エラーの種類
コード実行中に発生する可能性のあるエラーには様々なタイプがあります.各エラーには対応するエラーの種類がありますが、エラーが発生した場合は、該当するタイプのエラーのオブジェクトが投げられます.JSには以下の7種類のエラーがあります.
EveralErrorタイプのエラーは
eval()
関数を使用して異常が発生したときに投げ出されます.eval
属性の値を直接呼び出しではない方法で使用する場合、またはeval
属性の値を付与する場合、簡単に言えば、eval()
を関数として呼び出していない場合、エラーを投げます.new eval(); // EvalError
eval = foo; // EvalError
実際には、ブラウザは必ずしもエラーを投げ出すべき時にEvarrを投げ出すとは限りません.例えば、Firefox 4+とIE 8は第一の状況に対してType Errerを投げますが、第二の場合は成功して実行します.エラーは発生しません.RangeErrタイプのエラーは、数値が対応範囲を超えたときにトリガされます.例えば、配列を定義する際に、配列がサポートされていないエントリ数(
-20
やNumber.MAX_VALUE
など)が指定されていると、このようなエラーがトリガされる.ReferenceErrerタイプのエラーは、存在しない変数にアクセスする際に発生します.
SyntaxErrerタイプのエラーは、私たちが文法的に間違っているJavaScript文字列を
eval()
関数に入力すると、このようなエラーが発生します.構文エラーのコードがeval()
関数以外に現れた場合、SyntxErrはあまり使用できません.このときの構文エラーがJavaScriptコードを直ちに実行停止させます.Type ErrerタイプはJavaScriptでよく使われます.変数に意外なタイプが保存されている場合や、存在しない方法にアクセスする場合には、このようなエラーが発生します.エラーの原因は様々ですが、あくまでも特定のタイプの操作を行う場合、変数の種類が要求に合わないためです.いくつかの例を見てみます.
var o = new 10; // TypeError
alert("name" in true); // TypeError
Function.prototype.toString.call("name"); // TypeError
最もよく起こるタイプのエラーの場合は、関数に伝達されるパラメータは事前にチェックされていません.URIErrorタイプのエラーは
encodeURI()
またはdecodeURI()
を使用し、URIフォーマットが正しくないとURIErrorエラーを引き起こす.このようなエラーも珍しいです.前に述べた二つの関数の許容誤差が非常に高いからです.エラーの種類を知りたいなら、
try-catch
文のcatch
文にinstanceof
オペレータを使用しても良い.try{
someFunction();
} catch (error){
if (error instanceof TypeError){
//
} else if (error instanceof ReferenceError){
//
} else {
//
}
}
ブラウザをまたいでプログラミングする中で、エラーのタイプを検査するのは処理方式を確定する最も簡単な方法です.message
属性に含まれるエラーメッセージは、ブラウザによって異なります.try-catchを合理的に使う
try-catch
文にエラーが発生した場合、ブラウザはエラーはすでに処理されたと見なしていますので、本章の前で議論されたメカニズムによって記録または報告されません.ユーザーに技術理解を要求しない、誤ったWebアプリケーションをユーザが理解する必要もない、という理想的な結果である.しかし、try-catch
は、私たち自身のエラー処理メカニズムを実現させることができる.try-catch
を使用すると、制御できないエラーを処理するのに最適です.大きなJavaScriptライブラリの関数を使っていると、意図的にエラーを投げかけることがあります.このライブラリのソースコードを修正することができませんので、try-catch
文に関数の呼び出しを入れてもいいです.もし何か間違いがあったら、適切に処理してもいいです.自分のコードが間違っていることを明々白々と知っているときに、try-catch
文を使うのはあまり適当ではないです.例えば、関数に渡すパラメータが文字列であって、数値ではないと、関数が間違ってしまいます.パラメータの種類を確認してから、どうするかを決めます.この場合、try-catch
文は適用されません.