24

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror状態:

一部または多くのエラー イベントは window.onerror をトリガーしないことに注意してください。具体的にリッスンする必要があります。

  1. トリガーされないエラーの例をいくつか教えてくださいwindow.onerror。私SyntaxErrorはそれらの1つであることを知っています。
  2. このようなエラーをリッスンする方法を示す簡単なコード例を提供していただけますか? 私たちも聞いてSyntaxErrorみませんか?
4

1 に答える 1

24

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)では、引数は次のとおりです。

  1. message: エラーメッセージ (DOMString)
  2. url: エラーを含むファイルの URL (DOMString)
  3. 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 ブロックのように機能し、(サーバー ログを使用しても) 予期しないキャッチされなかった例外を適切に処理できます。

  • キャッチされない例外

    1. throw "some messages"
    2. call_something_undefined();
    3. cross_origin_iframe.contentWindow.document;、セキュリティ例外
  • もう少しコンパイルエラー

    1. <script>{</script>
    2. <script>for(;)</script>
    3. <script>"oops</script>
    4. setTimeout("{", 10);、最初の引数をスクリプトとしてコンパイルしようとします

しかし、ここでうまく説明されている 2 つの主要な問題:

  1. ローカルの try/catch ブロックとは異なり、window.onerror ハンドラーは例外オブジェクトに直接アクセスできず、エラーが発生したローカルではなくグローバル コンテキストで実行されます。つまり、開発者はコール スタックにアクセスできず、メソッドの呼び出し元のチェーンをたどって自分でコール スタックを構築することはできません。

  2. ブラウザーは、クロスオリジン スクリプトからの意図しないデータ漏洩を防ぐために、ハンドラーに提供されるデータをサニタイズするために多大な努力を払います。JavaScript を CDN でホストすると (当然のことですが)、上記のハンドラーで「スクリプト エラー」、「」、および 0 が返されます。それは特に役に立ちません。

于 2013-10-02T16:03:16.643 に答える