https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror州:
请注意,一些/多个错误事件不会触发window.onerror,您必须专门监听它们。
window.onerror
的错误示例?我知道SyntaxError
就是其中之一。SyntaxError
吗?答案 0 :(得分:20)
window.onerror
。 This 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)
,参数为:
message
:错误消息(DOMString)url
:包含错误(DOMString)linenumber
:发生错误的行号(unsigned long)如果你通过放置var x=document.getElementById("demo").value;
代替带有语法错误的代码(如我在示例中所示)来运行相同的示例,它也将被window.onerror()
函数捕获并将显示警告信息类似于:
JavaScript错误:TypeError:document.getElementById(...)为null page_url
的第25行
window.onerror 的行为类似于全局try / catch块,允许您优雅地处理(even with server logging)未被捕获的未被捕获的异常:
未捕获的异常
throw "some messages"
call_something_undefined()
; cross_origin_iframe.contentWindow.document;
,安全例外更多编译错误
<script>{</script>
<script>for(;)</script>
<script>"oops</script>
setTimeout("{", 10);
,它将尝试将第一个参数编译为脚本但是很好地描述了here的两个主要问题:
与本地try / catch块不同,window.onerror处理程序不支持 可以直接访问异常对象,并在。中执行 全局上下文而不是发生错误的本地。那 意味着开发人员无法访问调用堆栈,也无法访问 通过向上走一个方法的链来自己构建一个调用栈 呼叫者。
浏览器会竭尽全力消毒提供的数据 处理程序,以防止无意的数据泄漏 跨源脚本。如果您在CDN上托管JavaScript(就像您一样) 应该),你将在上面的处理程序中得到“脚本错误。”,“”和0。 这不是特别有用。
答案 1 :(得分:1)
并非真正直接回答您的问题,但如果您希望减少未观察到的JavaScript错误,拼写错误以及通常改进JavaScript编码风格的机会,请考虑使用严格的JavaScript模式 ("use strict";
)。它受到所有现代浏览器的支持,并向后兼容旧版本。一些相关的资源开始:
http://msdn.microsoft.com/en-us/library/ie/br230269(v=vs.94).aspx
http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
What does "use strict" do in JavaScript, and what is the reasoning behind it?
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"> </pre>
</body>
</html>
输出:
document.compatMode: CSS1Compat func1: strict func2: non-strict