在javascript中记录堆栈跟踪错误

时间:2009-12-25 14:25:36

标签: javascript jquery error-handling stack-trace onerror

我正在尝试在生产网站上记录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”函数内发生错误时,任何人都知道为什么会中断?

3 个答案:

答案 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',看看是否会触发异常。 有时“找不到对象”错误可能是因为尚未加载对象,并且可能存在与其他异常不同的处理。