JSエラー処理メカニズム2019-08-19(2)
5798 ワード
エラー処理メカニズム
一、Errorオブジェクトの例 JavaScript解析や実行中にエラーが発生すると、エンジンはエラーオブジェクトを投げます.JavaScript原生はエリロ構造関数を提供しています.投げられたすべてのエラーはこの構造関数の実例です. Errの6つの派生オブジェクト: を使用します. 以上の6つの派生エラーは,元のErrオブジェクトと共に構造関数である.開発者はそれらを使用して、エラーオブジェクトのインスタンスを手動で生成することができます.これらのコンストラクタは、エラーメッセージ情報を表すパラメータを受け入れます.
二、throw文
三、try…catch構造エラーが発生したら、プログラムの実行は中止されます.JavaScriptは try文は、1つまたは複数の語句からなるtryブロックと、少なくとも1つの の3つの形態の 1. 四、finallyコードブロック 以下は、finallyコードブロックの使用例の典型的なシーンである.
一、Errorオブジェクトの例
Error
例のオブジェクトは、エラー時のメッセージを示すmessage
属性が必要です.Error
の例はまた、エラーの名前とエラーを表すスタックname
とstack
の属性を提供する.しかし、それらは非標準的であり、すべての実装があるわけではない.message
:エラーメッセージ情報name
:エラー名(非標準属性)stack
:エラーのスタック(非標準属性)SyntaxError
オブジェクト(構文エラー)SyntaxError
オブジェクトが解析コードである場合に発生する構文エラーです.ReferenceError
オブジェクト(参照エラー)ReferenceError
オブジェクトは、存在しない変数を参照したときに発生したエラーです.例えば、関数の実行結果またはthis
に対して値を割り当てられないオブジェクトに値を割り当てる.RangeError
オブジェクト(参照エラー)RangeError
オブジェクトは、有効範囲を超えた値で発生するエラーが主にいくつかの場合があります.1つは、行列長さが負であり、2つはNumber
オブジェクトの方法パラメータが範囲外であり、関数スタックが最大値を超えている場合があります.TypeError
オブジェクト(タイプエラー)TypeError
オブジェクトは変数またはパラメータが予期されていない場合に発生するエラーです.例えば、文字列、ブール値、数値などの元のタイプの値にnewコマンドURIError
オブジェクト(符号化エラー)URIError
オブジェクトは、URI
相関関数のパラメータが正しくない場合にドロップされるエラーです.EvalError
オブジェクト(グローバルエラー)eval関数が正しく実行されていない場合、Evarrエラーが発生します.このエラータイプはもう使われなくなりました.以前のコードとの互換性を確保するために、保留を続けます.二、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構造
try...catch
構造を提供しており、エラーを処理して、次の実行を選択することができます.catch
子文または1つのfinally
子文のうちの1つまたは2つを含む.try
宣言: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
宣言の前に実行される.異常があるかどうかはともかく、投げ出したり、捕獲したりすることは常に実行されます.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
コードの実行が完了したら戻ってくるだけである.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
コードブロックが先に実行されます.