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種類のエラーがあります.
  • Errer
  • EveralErrer
  • RangeErr
  • ReferenceErrer
  • SyntxError
  • Type Error
  • URIError
  • ここで、Errorはベースタイプであり、他のタイプはこのタイプから継承されている.したがって、すべてのエラータイプは同じ属性のセットを共有しています.Errタイプのエラーは珍しいです.ブラウザから投げられたものもあります.この基本タイプの主な目的は開発者がカスタムエラーを出すことです.
    EveralErrorタイプのエラーはeval()関数を使用して異常が発生したときに投げ出されます.eval属性の値を直接呼び出しではない方法で使用する場合、またはeval属性の値を付与する場合、簡単に言えば、eval()を関数として呼び出していない場合、エラーを投げます.
    new eval(); //   EvalError 
    eval = foo; //   EvalError 
    
    実際には、ブラウザは必ずしもエラーを投げ出すべき時にEvarrを投げ出すとは限りません.例えば、Firefox 4+とIE 8は第一の状況に対してType Errerを投げますが、第二の場合は成功して実行します.エラーは発生しません.
    RangeErrタイプのエラーは、数値が対応範囲を超えたときにトリガされます.例えば、配列を定義する際に、配列がサポートされていないエントリ数(-20Number.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文は適用されません.