24

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

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

  1. 您能否提供一些不会触发的错误示例window.onerror?我知道SyntaxError是其中之一。
  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 ) 在第 26 行的page_url参数列表之后

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

  1. message: 错误信息 (DOMString)
  2. url: 包含错误的文件的 URL (DOMString)
  3. linenumber:发生错误的行号(无符号长)

如果您通过放置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);,它将尝试将第一个参数编译为脚本

但是这里很好地描述了两个主要问题:

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

  2. 浏览器不遗余力地清理提供给处理程序的数据,以防止跨域脚本意外泄漏数据。如果您将 JavaScript 托管在 CDN 上(如您所愿),您将在上述处理程序中收到“Script error.”、“”和 0。这不是特别有用。

于 2013-10-02T16:03:16.643 回答