我正在尝试在生产网站上记录javascript错误。到目前为止,它与网站中包含的以下代码相得益彰:
function catcherr(errorMessage, url, line) {
var parameters = "msg=" + escape(errorMessage)
+ "&url=" + escape(url)
+ "&line=" + escape(line);
new Image().src = "/error.gif?" + parameters;
return false;
};
window.onerror = catcherr;
我正在尝试向错误添加堆栈跟踪以获取更多信息。这基本上与以下想法一起使用,包括上面的函数:
try { i.dont.exist += 0; } // does not exist - that's the point
catch (e)
{
if (e.stack) // Firefox
{
// do some stuff
我使用jquery,一个简单的例子:
<script type="text/javascript">
jQuery(document).ready(function() {
p.foo += 1; // this should throw an error
// do stuff
});
</script>
有趣的是,当我在jquery的“ready”函数中出现错误时,“try {i.dont.exist + = 0;}”这一部分不会再抛出任何异常而引擎会停止任何错误。 通过上面的示例,catcherr扩展如下,只有“1”被警告:
function catcherr(errorMessage, url, line) {
try { alert(1); i.dont.exist += 0; alert(4);} catch(e) { alert(5);}
alert(2);
var parameters = "msg=" + escape(errorMessage)
// ...
}
当jquery的“ready”函数内发生错误时,任何人都知道为什么会中断?
答案 0 :(得分:8)
我不知道你为什么会遇到这个问题(看起来很奇怪,我不认为JQuery会出现问题,因为你的警报(1)不会被解雇),但我确实想要提到你对Error.stack的使用 - 当调用onerror
事件时,你没有原始错误的堆栈上下文,所以在那一点获得堆栈跟踪(通过捕获你自己的错误)将不会产生一个有意义的堆栈。
但是回到一个真正的答案 - 而不是通过编写特定的损坏代码来模拟问题,以便你可以捕获错误,如何直接抛出错误?你的onerror处理程序的第一行可能是:
try { throw new Error("dummy"); } catch (e) { alert(e.stack); }
这是有效的代码,更有可能不会给您带来问题。
答案 1 :(得分:1)
最有可能的是jQuery将回调包装在自己的try / catch中并忽略错误。
答案 2 :(得分:0)
在try / catch中尝试不同的异常。 比如a = 1/0或baddarr [5] ='bad',看看是否会触发异常。 有时“找不到对象”错误可能是因为尚未加载对象,并且可能存在与其他异常不同的处理。