https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror状态:
请注意,一些/许多错误事件不会触发 window.onerror,您必须专门监听它们。
- 您能否提供一些不会触发的错误示例
window.onerror
?我知道SyntaxError
是其中之一。 - 您能否提供一个小代码示例来展示我们如何监听此类错误?我们也可以听
SyntaxError
吗?
https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror状态:
请注意,一些/许多错误事件不会触发 window.onerror,您必须专门监听它们。
window.onerror
?我知道SyntaxError
是其中之一。SyntaxError
吗?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)
,参数是:
message
: 错误信息 (DOMString)url
: 包含错误的文件的 URL (DOMString)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 块,允许您优雅地处理(即使使用服务器日志记录)您不希望看到的未捕获异常:
未捕获的异常
throw "some messages"
call_something_undefined()
;cross_origin_iframe.contentWindow.document;
, 安全异常还有一些编译错误
<script>{</script>
<script>for(;)</script>
<script>"oops</script>
setTimeout("{", 10);
,它将尝试将第一个参数编译为脚本但是这里很好地描述了两个主要问题:
与本地 try/catch 块不同,window.onerror 处理程序不能直接访问异常对象,而是在全局上下文中执行,而不是在发生错误的本地执行。这意味着开发人员无法访问调用堆栈,也无法通过沿方法调用者链向上走来自己构建调用堆栈。
浏览器不遗余力地清理提供给处理程序的数据,以防止跨域脚本意外泄漏数据。如果您将 JavaScript 托管在 CDN 上(如您所愿),您将在上述处理程序中收到“Script error.”、“”和 0。这不是特别有用。