JSエラー処理メカニズム2019-08-19(2)

5798 ワード

エラー処理メカニズム
一、Errorオブジェクトの例
  • JavaScript解析や実行中にエラーが発生すると、エンジンはエラーオブジェクトを投げます.JavaScript原生はエリロ構造関数を提供しています.投げられたすべてのエラーはこの構造関数の実例です.
  • Error例のオブジェクトは、エラー時のメッセージを示すmessage属性が必要です.Errorの例はまた、エラーの名前とエラーを表すスタックnamestackの属性を提供する.しかし、それらは非標準的であり、すべての実装があるわけではない.message:エラーメッセージ情報name:エラー名(非標準属性)stack:エラーのスタック(非標準属性)
  • Errの6つの派生オブジェクト:
  • SyntaxErrorオブジェクト(構文エラー)SyntaxErrorオブジェクトが解析コードである場合に発生する構文エラーです.
  • ReferenceErrorオブジェクト(参照エラー)ReferenceErrorオブジェクトは、存在しない変数を参照したときに発生したエラーです.例えば、関数の実行結果またはthisに対して値を割り当てられないオブジェクトに値を割り当てる.
  • RangeErrorオブジェクト(参照エラー)RangeErrorオブジェクトは、有効範囲を超えた値で発生するエラーが主にいくつかの場合があります.1つは、行列長さが負であり、2つはNumberオブジェクトの方法パラメータが範囲外であり、関数スタックが最大値を超えている場合があります.
  • TypeErrorオブジェクト(タイプエラー)TypeErrorオブジェクトは変数またはパラメータが予期されていない場合に発生するエラーです.例えば、文字列、ブール値、数値などの元のタイプの値にnewコマンド
  • を使用します.
  • URIErrorオブジェクト(符号化エラー)URIErrorオブジェクトは、URI相関関数のパラメータが正しくない場合にドロップされるエラーです.
  • EvalErrorオブジェクト(グローバルエラー)eval関数が正しく実行されていない場合、Evarrエラーが発生します.このエラータイプはもう使われなくなりました.以前のコードとの互換性を確保するために、保留を続けます.
  • 以上の6つの派生エラーは,元のErrオブジェクトと共に構造関数である.開発者はそれらを使用して、エラーオブジェクトのインスタンスを手動で生成することができます.これらのコンストラクタは、エラーメッセージ情報を表すパラメータを受け入れます.
    二、throw文throw文の役割は、プログラムの実行を手動で中断し、エラーをスローすることです.
    if (x <= 0) {
      throw new Error('x      ');
    }
    // Uncaught ReferenceError: x is not defined
    
    throwが投げたエラーはそのパラメータであり、ここではErrの例である.throwは、任意のタイプの値を投げ出すことができる.つまり、そのパラメータはどの値でもよい.
    //        
    throw 'Error!';
    // Uncaught Error!
    
    //       
    throw 42;
    // Uncaught 42
    
    //        
    throw true;
    // Uncaught true
    
    //       
    throw {
      toString: function () {
        return 'Error!';
      }
    };
    // Uncaught {toString: ƒ}
    
    JavaScriptエンジンにとって、throw文が発生したら、プログラムは中止されます.
    三、try…catch構造
  • エラーが発生したら、プログラムの実行は中止されます.JavaScriptはtry...catch構造を提供しており、エラーを処理して、次の実行を選択することができます.
  • try文は、1つまたは複数の語句からなるtryブロックと、少なくとも1つのcatch子文または1つのfinally子文のうちの1つまたは2つを含む.
  • の3つの形態のtry宣言:
  • 1.try...catch
  • try...finally
  • try...catch...finally
  • try {
      throw new Error('   !');
    } catch (e) {
      console.log(e.name + ": " + e.message);
      console.log(e.stack);
    }
    // Error:    !
    //   at :3:9
    //   ...
    
  • catchサブ句は、tryブロックにおいて、例外をスローした場合に実行すべきステートメントを含む.つまり、try文の内容を成功させたいです.成功しなかったら、次のことを制御したいです.catch文で実現できます.tryブロックにいずれかの語句がある場合(またはtryブロックから呼び出された関数)に異常が発生した場合、制御は直ちにcatchサブルーチンに移る.tryブロックに異常がなければ、catchサブルーチンはスキップされる.
  • catchコードブロックがエラーをキャッチした後、プログラムは中断されず、通常の流れに従って実行され続けます.
  • catchコードブロックの中には、さらに、入れ子try...catch構造を使用してエラーをスローすることもできる.
  • var n = 100;
    
    try {
      throw n;
    } catch (e) {
      if (e <= 50) {
        // ...
      } else {
        throw e;
      }
    }
    // Uncaught 100
    
  • catchは、tryコードブロックから投げられた値を示すパラメータを受け取る.
  • catchコードブロックに判断文if...elseを追加することができる.エラーの種類を判断して、異なる処理を行うために使用します.
  • try {
      foo.bar();
    } catch (e) {
      if (e instanceof EvalError) {
        console.log(e.name + ": " + e.message);
      } else if (e instanceof RangeError) {
        console.log(e.name + ": " + e.message);
      }
      // ...
    }
    
  • finallyサブ句は、tryブロックとcatchブロックの後に実行されるが、次のtry宣言の前に実行される.異常があるかどうかはともかく、投げ出したり、捕獲したりすることは常に実行されます.
  • 四、finallyコードブロック
  • ry...catch構造は、エラーが発生したかどうかにかかわらず、最後に実行しなければならないステートメントを示すfinallyコードブロックを最後に追加することを可能にする.
  • function cleansUp() {
      try {
        throw new Error('   ……');
        console.log('      ');
      } finally {
        console.log('      ');
      }
    }
    
    cleansUp()
    //       
    // Uncaught Error:    ……
    //    at cleansUp (:3:11)
    //    at :10:1
    
    上記のコードには、catchステートメントブロックがないため、エラーが発生するとコードは実行を中断します.実行を中断する前に、finallyコードブロックを実行してから、エラーメッセージをユーザに提示します.
    function idle(x) {
      try {
        console.log(x);
        return 'result';
      } finally {
        console.log('FINALLY');
      }
    }
    
    idle('hello')
    // hello
    // FINALLY
    
    上記のコードには、tryコードブロックにエラーが発生していません.また、return文も含まれていますが、finallyコードブロックはまだ実行されています.また、この関数の戻り値はresultである.
  • return文の実行はfinallyコードの前にあるが、finallyコードの実行が完了したら戻ってくるだけである.
  • 以下は、finallyコードブロックの使用例の典型的なシーンである.
  • openFile();
    
    try {
      writeFile(Data);
    } catch(e) {
      handleError(e);
    } finally {
      closeFile();
    }
    
    上記のコードはまずファイルを開き、tryコードブロックにファイルを書き込みます.もしエラーが発生していないなら、finallyコードブロックを実行してファイルを閉じます.エラーが発生したら、catchコードブロックを使ってエラーを処理してから、finallyコードブロックを使ってファイルを閉じます.
  • try...catch...finallyの3つの間の実行順序、例:
  • function f() {
      try {
        console.log(0);
        throw 'bug';
      } catch(e) {
        console.log(1);
        return true; //          finally         
        console.log(2); //     
      } finally {
        console.log(3);
        return false; //            return
        console.log(4); //     
      }
    
      console.log(5); //     
    }
    
    var result = f();
    // 0
    // 1
    // 3
    
    result
    // false
    
    上記の例ではcatchコードブロックが実行される前に、finallyコードブロックが先に実行されます.