jsシステム教程-17-js文法の異常処理-error、カスタム異常、try catch finally


目次
  • ディレクトリ
  • エラー処理メカニズム
  • Errオブジェクト例
  • 元のエラータイプ
  • SyntxErrorオブジェクト
  • ReferenceErrオブジェクト
  • RangeErrオブジェクト
  • Type Errorオブジェクト
  • URIERオブジェクト
  • EveralErrerオブジェクト
  • カスタムエラー
  • throw文
  • try…catch構造
  • finallyコードブロック
  • 原文アドレス
  • カタログナビゲーション
  • エラー処理メカニズム
    Errオブジェクトの例
    JavaScript解析や運転中にエラーが発生すると、エンジンはエラーオブジェクトを投げます.JavaScript原生はエリロ構造関数を提供しています.投げられたすべてのエラーはこの構造関数の実例です.
    var err = new Error('   ');
    err.message // "   "
    JavaScript言語標準は、Errerオブジェクトの実例となるオブジェクトには、エラー時のヒント情報が必要であり、他の属性は言及されていません.ほとんどのJavaScriptエンジンは、Errerのインスタンスに対して、nameとstack属性を提供しています.それぞれが間違った名前と間違ったスタックを表していますが、それらは標準ではなく、それぞれの実装があります.
  • メッセージ:エラーメッセージ情報
  • name:エラー名(非標準属性)
  • stack:エラーのスタック(非標準属性)
  • オリジナルエラータイプError例のオブジェクトは最も一般的なエラータイプであり、それに基づいて、JavaScriptは他の6つのエラーオブジェクトも定義している.つまり、Errerの6つの派生オブジェクトが存在する.
    SyntaxErrorオブジェクト
    SyntaxErrオブジェクトはコード解析時に発生する構文エラーです.
    //      
    var 1a;
    // Uncaught SyntaxError: Invalid or unexpected token
    
    //     
    console.log 'hello');
    // Uncaught SyntaxError: Unexpected string
    上のコードのエラーは文法解析段階で発見されますので、SyntxErrを投げます.最初のエラーメッセージは「token不正」で、2番目のエラーメッセージは「文字列が要求に合わない」です.
    ReferenceErrオブジェクト
    ReferenceErrオブジェクトは、存在しない変数を引用したときに発生したエラーです.
    //           
    unknownVariable
    // Uncaught ReferenceError: unknownVariable is not defined
            ,              ,            this//         
    console.log() = 1
    // Uncaught ReferenceError: Invalid left-hand side in assignment
    
    // this         
    this = 1
    // ReferenceError: Invalid left-hand side in assignment
    上のコードは関数のconsolie.logの実行結果とthisの割り当てに対して、結果としてReferenceErrエラーを引き起こしました.
    RangeErrオブジェクト
    RangeErrオブジェクトは有効範囲を超えた値で発生したエラーです.主に何種類かの場合があります.一つは配列長が負、二つはNumberオブジェクトの方法パラメータが範囲外、及び関数スタックが最大値を超えています.
    //          
    new Array(-1)
    // Uncaught RangeError: Invalid array length
    TypeErrオブジェクト
    TypeErrオブジェクトは変数またはパラメータが予期されていない場合に発生するエラーです.例えば、文字列、ブール値、数値などの元のタイプの値にnewコマンドを使うと、newコマンドのパラメータは構造関数であるべきです.
    new 123
    // Uncaught TypeError: number is not a func
    
    var obj = {};
    obj.unknownMethod()
    // Uncaught TypeError: obj.unknownMethod is not a function
    上のコードの第二の場合、オブジェクトを呼び出す方法は存在しません.機能ではなく、Type Errエラーも投げられます.
    URIERオブジェクト
    URIErrorオブジェクトはURI相関関数のパラメータが正しくない時に投げ出すエラーで、主にencodeURI()、decodeURI()、encodeURIComponent()、decodedecodeURIComponent()、escape()とunescape()の6つの関数に関連します.
    decodeURI('%2')
    // URIError: URI malformed
    EveralErrerオブジェクト
    eval関数が正しく実行されていない場合、Evarrエラーが発生します.このエラータイプはもう使われなくなりました.以前のコードとの互換性を確保するために、保留を続けます.
    カスタムエラー
    JavaScript原生が提供した7つのエラーオブジェクト以外に、自分の間違ったオブジェクトを定義することもできます.
    function UserError(message) {
      this.message = message || '    ';
      this.name = 'UserError';
    }
    
    UserError.prototype = new Error();
    UserError.prototype.constructor = UserError;
    上のコードは間違ったオブジェクトをカスタマイズして、Errオブジェクトを継承します.このようなカスタムタイプのエラーが発生します.
    new UserError('        !');
    throw文
    throw文の役割は、手動でプログラムを中断し、エラーをスローすることです.
    if (x < 0) {
      throw new Error('x      ');
    }
    // Uncaught ReferenceError: x is not defined
    上のコードの中で、変数xが0より小さい場合、手動でエラーを投げ、ユーザーxの値が正しくないということを伝えると、プログラム全体はここで中断されます.throwが投げたエラーはそのパラメータであり、ここではErrの例であることが分かります.
    throwはカスタムエラーを出すこともできます.
    function UserError(message) {
      this.message = message || '    ';
      this.name = 'UserError';
    }
    
    throw new UserError('   !');
    // Uncaught UserError {message: "   !", name: "UserError"}
    上のコードの中で、throwが投げ出したのはUserErrの例です.
    実際には、throwは任意の種類の値を投げることができる.つまり、そのパラメータはどの値でもよい.
    //        
    throw 'Error!';
    // Uncaught Error!
    
    //       
    throw 42;
    // Uncaught 42
    
    //        
    throw true;
    // Uncaught true
    
    //       
    throw {
      toString: function () {
        return 'Error!';
      }
    };
    // Uncaught {toString: ƒ}
    JavaScriptエンジンにとって、throw文が発生したら、プログラムは中止されます.
    エンジンは、throwが投げたメッセージを受信します.エラーの例でもありますし、他のタイプの値でもあります.
    try…catch構造
    エラーが発生したら、プログラムは実行を中止します.JavaScriptはtry...catch構造を提供しています.エラーを処理し、次の実行を選択することができます.
    try {
      throw new Error('   !');
    } catch (e) {
      console.log(e.name + ": " + e.message);
      console.log(e.stack);
    }
    // Error:    !
    //   at :3:9
    //   ...
    上のコードの中で、tryコードブロックはエラー(上の例ではthrow文)を投げました.JavaScriptエンジンは直ちにコードの実行をcatchコードブロックに変えます.またはエラーはcatchコードブロックに捕獲されました.catchは一つのパラメータを受け入れて、tryコードブロックの投げた値を表します.
    いくつかのコードがエラーであるかどうかを確認しないと、try...catchコードブロックにそれらを置くことができます.さらにエラーを処理するのに便利です.
    try {
      f();
    } catch(e) {
      //     
    }
    上のコードでは、関数fがエラーを実行すると、catchコードブロックを行い、エラーを処理します.
    catchコードブロックがエラーをキャッチした後、プログラムは中断されず、通常の流れに従って実行されます.
    try {
      throw "   ";
    } catch (e) {
      console.log(111);
    }
    console.log(222);
    // 111
    // 222
    上のコードでは、tryコードブロックから投げられたエラーが、catchコードブロックに取り込まれた後、プログラムは下の方向に進みます.
    catchコードブロックの中には、更にエラーを投げて、さらに入れ子のtry...catch構造を使うこともできます.
    var n = 100;
    
    try {
      throw n;
    } catch (e) {
      if (e <= 50) {
        // ...
      } else {
        throw e;
      }
    }
    // Uncaught 100
    上のコードの中で、catchコードの中からまた一つのエラーが出ました.
    異なる種類のエラーをキャッチするために、catchコードブロックに判定文を入れることができます.
    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);
      }
      // ...
    }
    上記のコードでは、catchがエラーをキャッチした後、エラーの種類を判断し、異なる処理を行います.
    finallyコードブロック
    try...catch構造は最後にfinallyコードブロックを追加することができます.エラーが発生しても最後に実行しなければならないステートメントを表します.
    function cleansUp() {
      try {
        throw new Error('   ……');
        console.log('      ');
      } finally {
        console.log('      ');
      }
    }
    
    cleansUp()
    //       
    // Error:    ……
    上のコードには、catch文のブロックがないため、エラーはキャプチャされていません.finallyコードブロックを実行した後、プログラムはエラーの場所で中断されます.
    function idle(x) {
      try {
        console.log(x);
        return 'result';
      } finally {
        console.log("FINALLY");
      }
    }
    
    idle('hello')
    // hello
    // FINALLY
    // "result"
    原文の住所
    原文の住所
    本教程は知識共有署名-同じ方式で3.0プロトコルを共有する.
    ディレクトリナビゲータ
    ディレクトリナビゲータ