window.onerror
構文エラーか実行時エラーかに関係なく、トリガーされます。quirksmodeのこのページには、キャッチするエラー イベントとキャッチしないエラー イベントのリストがあります。
このようなエラーをリッスンする方法を示す簡単なコード例を提供していただけますか? SyntaxError もリッスンできますか?
このようなエラーをリッスンする方法を示す小さなコード例:
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
window.onerror = function (errorMsg, url, lineNumber) {
alert(errorMsg + lineNumber);
// alert("This is a stack trace! Wow! --> %s", error.stack);
};
</script>
</head>
<body>
<script type="text/javascript">
//var x=document.getElementById("demo").value; //uncomment and run to see
document.write('careless to close the parentheses?'; // ')' is not given
</script>
</body>
</html>
この例をブラウザで実行すると、次のような警告メッセージがポップアップ表示されます。
JavaScript エラー: SyntaxError: missing ) がpage_urlの 26 行目の引数リストの後にある
上記の例:window.onerror = function(message, url, linenumber)
では、引数は次のとおりです。
message
: エラーメッセージ (DOMString)
url
: エラーを含むファイルの URL (DOMString)
linenumber
: エラーが発生した行番号 (unsigned long)
var x=document.getElementById("demo").value;
構文エラーのあるコードの代わりに同じ例を実行すると(例で示したように)、window.onerror()
関数によってキャッチされ、次のような警告メッセージが表示されます。
JavaScript エラー: TypeError: document.getElementById(...) is null on line 25 for page_url
window.onerrorは、グローバルな try/catch ブロックのように機能し、(サーバー ログを使用しても) 予期しないキャッチされなかった例外を適切に処理できます。
キャッチされない例外
throw "some messages"
call_something_undefined()
;
cross_origin_iframe.contentWindow.document;
、セキュリティ例外
もう少しコンパイルエラー
<script>{</script>
<script>for(;)</script>
<script>"oops</script>
setTimeout("{", 10);
、最初の引数をスクリプトとしてコンパイルしようとします
しかし、ここでうまく説明されている 2 つの主要な問題:
ローカルの try/catch ブロックとは異なり、window.onerror ハンドラーは例外オブジェクトに直接アクセスできず、エラーが発生したローカルではなくグローバル コンテキストで実行されます。つまり、開発者はコール スタックにアクセスできず、メソッドの呼び出し元のチェーンをたどって自分でコール スタックを構築することはできません。
ブラウザーは、クロスオリジン スクリプトからの意図しないデータ漏洩を防ぐために、ハンドラーに提供されるデータをサニタイズするために多大な努力を払います。JavaScript を CDN でホストすると (当然のことですが)、上記のハンドラーで「スクリプト エラー」、「」、および 0 が返されます。それは特に役に立ちません。