我们如何监听不触发window.onerror的错误?

时间:2013-10-02 15:52:04

标签: javascript

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

  

请注意,一些/多个错误事件不会触发window.onerror,您必须专门监听它们。

  1. 您能否提供一些不会触发window.onerror的错误示例?我知道SyntaxError就是其中之一。
  2. 您能否提供一个小代码示例来说明我们如何监听此类错误?我们也可以收听SyntaxError吗?

2 个答案:

答案 0 :(得分:20)

无论是语法错误还是运行时错误,都会触发

window.onerrorThis page from 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)   26 for page_url

在上面的示例中:window.onerror = function(message, url, linenumber),参数为:

  1. message:错误消息(DOMString)
  2. url:包含错误(DOMString)
  3. 的文件的URL
  4. linenumber:发生错误的行号(unsigned long)
  5. 如果你通过放置var x=document.getElementById("demo").value;代替带有语法错误的代码(如我在示例中所示)来运行相同的示例,它也将被window.onerror()函数捕获并将显示警告信息类似于:

      

    JavaScript错误:TypeError:document.getElementById(...)为null    page_url

    的第25行

    window.onerror 的行为类似于全局try / catch块,允许您优雅地处理(even with server logging)未被捕获的未被捕获的异常:

    • 未捕获的异常

      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);,它将尝试将第一个参数编译为脚本

    但是很好地描述了here的两个主要问题:

    1. 与本地try / catch块不同,window.onerror处理程序不支持 可以直接访问异常对象,并在。中执行 全局上下文而不是发生错误的本地。那 意味着开发人员无法访问调用堆栈,也无法访问 通过向上走一个方法的链来自己构建一个调用栈 呼叫者。

    2. 浏览器会竭尽全力消毒提供的数据 处理程序,以防止无意的数据泄漏 跨源脚本。如果您在CDN上托管JavaScript(就像您一样) 应该),你将在上面的处理程序中得到“脚本错误。”,“”和0。 这不是特别有用。

答案 1 :(得分:1)

并非真正直接回答您的问题,但如果您希望减少未观察到的JavaScript错误,拼写错误以及通常改进JavaScript编码风格的机会,请考虑使用严格的JavaScript模式"use strict";)。它受到所有现代浏览器的支持,并向后兼容旧版本。一些相关的资源开始:

HTML文档必须处于标准模式才能使用JavaScript严格模式。例如:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title></title>
    <script type="text/javascript">
        window.func1 = function() {
            "use strict";
            return (eval("var __temp = null"), (typeof __temp === "undefined")) ? 
                "strict": 
                "non-strict";
        }

        window.func2 = function() {
            return (eval("var __temp = null"), (typeof __temp === "undefined")) ? 
                "strict": 
                "non-strict";
        }

        window.onload = function() {
            info.firstChild.data = 
                "\ndocument.compatMode: " + document.compatMode +
                "\nfunc1: " + func1() +
                "\nfunc2: " + func2();
        }
    </script>
</head>
<body>
    <pre id="info">&nbsp;</pre>
</body>
</html>

输出:

document.compatMode: CSS1Compat
func1: strict
func2: non-strict