Cocosd 2 d-js異常処理
40921 ワード
Errorオブジェクト
コード解析や実行中にエラーが発生すると、JavaScriptエンジンは自動的にErrorオブジェクトのインスタンスを生成して投げ出し、プログラム全体がエラーが発生した場所で中断します.
Errorオブジェクトのインスタンスには、3つの最も基本的なプロパティがあります.
name:エラー名Message:エラーメッセージstack:エラースタック(標準属性ではありませんが、ほとんどのプラットフォームでサポートされています)nameとmessageの2つの属性を用いて,どのようなエラーが発生したかを大まかに理解することができる.
上のコードは、エラーの名前とエラーメッセージを表示します.
stackプロパティは、エラーが発生したときのスタックを表示します.
上のコードは、エラーを投げ出すのはまずthrowit関数で、それからcatchit関数で、最後に関数の実行環境であることを示しています.
JavaScriptのオリジナルエラータイプ
Errorオブジェクトは最も一般的なエラータイプであり、それに基づいてJavaScriptは他の6つのエラー、すなわち、Errorの6つの派生オブジェクトも定義している.
(1)SyntaxError
SyntaxErrorは、コードを解析するときに発生する構文エラーです.
(2)ReferenceError
ReferenceErrorは、存在しない変数を参照するときに発生するエラーです.
もう1つのトリガシーンは、関数の実行結果やthisに値を割り当てるなど、割り当てられないオブジェクトに値を割り当てることです.
上のコードは関数console.logの実行結果とthisの値付けの結果、ReferenceErrorエラーが発生しました.
(3)RangeError
RangeErrorは、値が有効範囲を超えた場合に発生するエラーです.配列長が負である場合と,Numberオブジェクトのメソッドパラメータが範囲外である場合と,関数スタックが最大値を超える場合が主にいくつかある.
(4)TypeError
TypeErrorは、変数またはパラメータが予想されるタイプでない場合に発生するエラーです.たとえば、文字列、ブール値、数値などの元のタイプの値に対してnewコマンドを使用すると、newコマンドのパラメータがコンストラクション関数であるべきであるため、このエラーが放出されます.
上記のコードの2つ目の場合,呼び出しオブジェクトが存在しないメソッドはTypeErrorエラーを投げ出す.
(5)URIError
URIErrorはURI関連関数のパラメータが正しくない場合に投げ出されるエラーであり、主にencodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()およびunescape()の6つの関数に関連する.
(6)EvalError
eval関数が正しく実行されていない場合、EvalErrorエラーが放出されます.このエラータイプはES 5には表示されなくなり、以前のコードとの互換性を保証するために保持されます.
以上の6つの派生エラーは,元のErrorオブジェクトとともに構造関数である.開発者は、それらを使用して、エラーオブジェクトのインスタンスを人為的に生成することができます.
上のコードは、新しいエラーオブジェクトのインスタンスを示しています.実質的には、手動でエラーを投げ出すことです.エラー・オブジェクトのコンストラクション関数は、エラー・プロンプト情報(message)を表すパラメータを受け入れます.
カスタムエラー
JavaScriptに組み込まれている7種類のエラーオブジェクトに加えて、独自のエラーオブジェクトを定義することもできます.
上のコードは、エラーオブジェクトUserErrorをカスタマイズし、Errorオブジェクトを継承します.そして、このようなカスタムエラーを生成することができます.
throw文
上記のコードは、
単純なエラーであれば、エラーメッセージを返すだけでいいのですが、複雑な状況に遭遇した場合は、エラー後にさらに処理する必要があります.この場合、
上の文は
try...catch構造
エラーを処理するためには、
上記のコードでは、
上記のコードでは、
上記のコードでは、
上記のコードでは、
異なるタイプのエラーをキャプチャするために、
上記のコードでは,
finallyコードブロック
上記のコードは、
上記のコードは、
次の例では、
上記のコード説明では、
次に、
上のコードはまずファイルを開き、
次の例は、
上記のコードでは、
上記のコードでは、
場合によっては、
コード解析や実行中にエラーが発生すると、JavaScriptエンジンは自動的にErrorオブジェクトのインスタンスを生成して投げ出し、プログラム全体がエラーが発生した場所で中断します.
Errorオブジェクトのインスタンスには、3つの最も基本的なプロパティがあります.
name:エラー名Message:エラーメッセージstack:エラースタック(標準属性ではありませんが、ほとんどのプラットフォームでサポートされています)nameとmessageの2つの属性を用いて,どのようなエラーが発生したかを大まかに理解することができる.
if (error.name){
console.log(error.name + ": " + error.message);
}
上のコードは、エラーの名前とエラーメッセージを表示します.
stackプロパティは、エラーが発生したときのスタックを表示します.
function throwit() {
throw new Error('');
}
function catchit() {
try {
throwit();
} catch(e) {
console.log(e.stack); // print stack trace
}
}
catchit()
// Error
// at throwit (~/examples/throwcatch.js:9:11)
// at catchit (~/examples/throwcatch.js:3:9)
// at repl:1:5
上のコードは、エラーを投げ出すのはまずthrowit関数で、それからcatchit関数で、最後に関数の実行環境であることを示しています.
JavaScriptのオリジナルエラータイプ
Errorオブジェクトは最も一般的なエラータイプであり、それに基づいてJavaScriptは他の6つのエラー、すなわち、Errorの6つの派生オブジェクトも定義している.
(1)SyntaxError
SyntaxErrorは、コードを解析するときに発生する構文エラーです.
//
var 1a;
//
console.log 'hello');
(2)ReferenceError
ReferenceErrorは、存在しない変数を参照するときに発生するエラーです.
unknownVariable
// ReferenceError: unknownVariable is not defined
もう1つのトリガシーンは、関数の実行結果やthisに値を割り当てるなど、割り当てられないオブジェクトに値を割り当てることです.
console.log() = 1
// ReferenceError: Invalid left-hand side in assignment
this = 1
// ReferenceError: Invalid left-hand side in assignment
上のコードは関数console.logの実行結果とthisの値付けの結果、ReferenceErrorエラーが発生しました.
(3)RangeError
RangeErrorは、値が有効範囲を超えた場合に発生するエラーです.配列長が負である場合と,Numberオブジェクトのメソッドパラメータが範囲外である場合と,関数スタックが最大値を超える場合が主にいくつかある.
new Array(-1)
// RangeError: Invalid array length
(1234).toExponential(21)
// RangeError: toExponential() argument must be between 0 and 20
(4)TypeError
TypeErrorは、変数またはパラメータが予想されるタイプでない場合に発生するエラーです.たとえば、文字列、ブール値、数値などの元のタイプの値に対してnewコマンドを使用すると、newコマンドのパラメータがコンストラクション関数であるべきであるため、このエラーが放出されます.
new 123
//TypeError: number is not a func
var obj = {};
obj.unknownMethod()
// TypeError: undefined is not a function
上記のコードの2つ目の場合,呼び出しオブジェクトが存在しないメソッドはTypeErrorエラーを投げ出す.
(5)URIError
URIErrorはURI関連関数のパラメータが正しくない場合に投げ出されるエラーであり、主にencodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()およびunescape()の6つの関数に関連する.
decodeURI('%2')
// URIError: URI malformed
(6)EvalError
eval関数が正しく実行されていない場合、EvalErrorエラーが放出されます.このエラータイプはES 5には表示されなくなり、以前のコードとの互換性を保証するために保持されます.
以上の6つの派生エラーは,元のErrorオブジェクトとともに構造関数である.開発者は、それらを使用して、エラーオブジェクトのインスタンスを人為的に生成することができます.
new Error(" !");
new RangeError(" , !");
new TypeError(" , !");
上のコードは、新しいエラーオブジェクトのインスタンスを示しています.実質的には、手動でエラーを投げ出すことです.エラー・オブジェクトのコンストラクション関数は、エラー・プロンプト情報(message)を表すパラメータを受け入れます.
カスタムエラー
JavaScriptに組み込まれている7種類のエラーオブジェクトに加えて、独自のエラーオブジェクトを定義することもできます.
function UserError(message) {
this.message = message || " ";
this.name = "UserError";
}
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
上のコードは、エラーオブジェクトUserErrorをカスタマイズし、Errorオブジェクトを継承します.そして、このようなカスタムエラーを生成することができます.
new UserError(" !");
throw文
throw
文の役割は、プログラムの実行を中断し、予期せぬエラーまたはエラーを投げ出すことです.パラメータとして式を受け入れ、さまざまな値を放出できます.//
throw "Error!";
//
throw 42;
//
throw true;
//
throw {toString: function() { return "Error!"; } };
上記のコードは、
throw
がパラメータとして様々な値を受け入れることができることを示している.JavaScriptエンジンは、throw
文に遭遇すると、後続の文の実行を停止し、throw
文のパラメータ値をユーザーに返します.単純なエラーであれば、エラーメッセージを返すだけでいいのですが、複雑な状況に遭遇した場合は、エラー後にさらに処理する必要があります.この場合、
throw
文を使用してError
オブジェクトを手動で投げ出すのが最善です.throw new Error(' !');
上の文は
Error
オブジェクトを新規に作成し、そのオブジェクトを投げ出すと、プログラム全体がこの場所で中断されます.throw
文はまた、ユーザがカスタマイズしたエラーを投げ出すこともできる.function UserError(message) {
this.message = message || " ";
this.name = "UserError";
}
UserError.prototype.toString = function (){
return this.name + ': "' + this.message + '"';
}
throw new UserError(" !");
try...catch構造
エラーを処理するためには、
try...catch
構造が必要である.try {
throw new Error(' !');
} catch (e) {
console.log(e.name + ": " + e.message);
console.log(e.stack);
}
// Error: !
// at <anonymous>:3:9
// ...
上記のコードでは、
try
コードブロックがエラーを投げ出すと(上記の例ではthrow
文を用いた)、JavaScriptエンジンは直ちにコードの実行を行い、catch
コードブロックに移行する.エラーはcatch
コードブロックによってキャプチャされると見なすことができる.catch
は、try
コードブロックが投げ出された値を示すパラメータを受け入れる.function throwIt(exception) {
try {
throw exception;
} catch (e) {
console.log('Caught: '+ e);
}
}
throwIt(3);
// Caught: 3
throwIt('hello');
// Caught: hello
throwIt(new Error('An error happened'));
// Caught: Error: An error happened
上記のコードでは、
throw
文が数値、文字列、エラーオブジェクトを相次いで投げ出します.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;
}
}
上記のコードでは、
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
がエラーをキャプチャした後,エラータイプ(EvalError
かRangeError
か)を判断し,異なる処理を行う.try...catch
構造はJavaScript言語がJava言語の影響を受ける明らかな例である.このような構造がどれだけ少ないかは構造化プログラミングの原則を破壊し、処理が適切でないとgoto
文のような効果になり、慎重に使用すべきである.finallyコードブロック
try...catch
構造は、エラーが発生するかどうかにかかわらず、最後に実行する必要がある文を示すfinally
コードブロックを最後に追加することを可能にする.function cleansUp() {
try {
throw new Error('Sorry...');
} finally {
console.log('Performing clean-up');
}
}
cleansUp()
// Performing clean-up
// Error: Sorry...
上記のコードは、
throw
文がエラーを投げ出した後、finally
が実行されることを示している.function idle(x) {
try {
console.log(x);
return 'result';
} finally {
console.log("FINALLY");
}
}
idle('hello')
// hello
// FINALLY
// "result"
上記のコードは、
return
文が前であってもfinally
符号ブロックが実行され、その実行が完了するとreturn
文の値が表示されることを示している.次の例では、
return
文の実行はfinally
コードの前に並べられており、finally
コードの実行が完了してから戻るだけです.var count = 0;
function countUp() {
try {
return count;
} finally {
count++;
}
}
countUp()
// 0
count
// 1
上記のコード説明では、
return
文のcount
の値は、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
コードブロックが実行される.catch
からfinally
に転入したフラグは、return
文だけでなく、throw
文もあります.function f() {
try {
throw ' !';
} catch(e) {
console.log(' ');
throw e; // finally
} finally {
return false; //
}
}
try {
f();
} catch(e) {
//
console.log('caught outer "bogus"');
}
//
上記のコードでは、
catch
コードブロックに入った後、throw
文に遭遇するとfinally
コードブロックが実行され、そのうちreturn false
文があるので、直接戻ってきて、catch
コードブロックの残りの部分は実行されません.場合によっては、
catch
コードブロックを省略し、finally
コードブロックのみを使用することもできる.openFile();
try {
writeFile(Data);
} finally {
closeFile();
}