##1.エラー処理構文:(js には例外 exception という概念はなく、すべてエラー error です)
try{
//throw new Error(msg);
//throw '错误';
//throw false;
//throw ...
//throw 演算子の被演算数には何の制限もなく、自由に投げられます
}
catch(err){
//alert(err.message);//message はすべてのブラウザでサポートされる唯一のプロパティです
}
finally{
//
}
注意:[IE7-] にはバグがあります:catch ブロックがないと、finally ブロックは実行されません。そのため、完全な try-catch-finally を使用することを推奨します
高程には記述上の誤りがあります(中文版 501 ページ):
読者は必ず覚えておいてください、コードが finally 節を含む限り、try または catch 文ブロック内の return 文はすべて無視されます。
本机テスト結果:finally に入る前に遭遇した return は、finally 完了後にも return されます。本に書かれている「無視」というわけではなく、おそらく単なる曖昧さでしょう。
さらに、js には java の例外処理と同じ秘密が存在します。例えば:
//コード来自 http://www.cnblogs.com/averey/p/4379646.html
function aaa(){
var x = 1;
try {
return ++x;
} catch (err) {
} finally {
++x;
}
return x;
}
(function(){
var y = aaa();
alert(y);//2
})();
詳細は以下を参照してください:
もちろん、このような小さな秘密は知っていればよく、深く追求する必要はありません
##2.7 つのエラータイプ
-
Error
-
EvalError
-
RangeError
-
ReferenceError
-
SyntaxError
-
TypeError
-
URIError
##3.error イベント
ブラウザのエラー報告を避ける最後の防衛線として、構文は以下の通り:
window.onerror = function(msg, url, line){
return true;//エラー報告しない
}
注意:上記�� DOM0 級方式のみ でイベントハンドラを追加できます。DOM2 級標準に準拠していないためです
注意:高程中文第三版 506 ページに問題があります。実際には true を返すとエラー報告せず、本に書かれている false を返すのではありません。テストコードは以下の通り:
window.onerror = function(e) {
return true;//Chrome, FF, IE8 はすべてエラー報告しない
//return false;//Chrome, FF はエラー報告、IE8 はエラー報告しない
}
'str'.startWith('x');///エラーをトリガー
##4.いくつかの常識
-
型変換と型変換エラーを避けるため、できるだけ===と!==を使用して比較してください
-
制御文内ではできるだけブール値を使用し、if(value) のような構造は使用しないでください。自動的に行われる型変換により、複数の偽値が存在するためです:
-
false
-
+0/-0
-
undefined
-
null
-
''/""(空文字列)
-
NaN
-
これらの偽値は予期しない結果を招く可能性があります。===と!==のみを使用すれば false という偽値のみとなり、意味を正確に表せます
-
if(value != null) や if(value != undefined) のような検出は使用せず、以下の通りにすべきです:
-
オブジェクト値の検出には if(value instanceof Type) を使用
-
基本タイプ値の検出には if(typeof value === strType) を使用
-
-
body 内のスクリプトで document.body 関連の DOM 操作(ノードの追加/削除)を行わないでください。IE エラーを発生させる可能性があるためです
-
外部 js ファイルも js 構文エラーを引き起こす可能性があり、エラー情報は不正確で発見が難しいため、外部スクリプトを参照する前に十分なテストを行うべきです
-
IE の URI 長さ制限は 2048 文字以下であるため、get で post リクエストを置き換えてパフォーマンスを最適化する際、クエリ文字列の長さをできるだけ短くするべきです(例えば短いフィールド名を使用するなど)
コメントはまだありません