在javascript中记录堆栈跟踪错误

2ni*_*2ni 12 javascript error-handling jquery 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;
Run Code Online (Sandbox Code Playgroud)

我正在尝试向错误添加堆栈跟踪以获取更多信息.这基本上与以下想法一起使用,包括上面的功能:

    try { i.dont.exist += 0; } // does not exist - that's the point
    catch (e)
    {
            if (e.stack) // Firefox
            {
               // do some stuff
Run Code Online (Sandbox Code Playgroud)

我使用jquery,一个简单的例子:

<script type="text/javascript">
jQuery(document).ready(function() {
    p.foo += 1; // this should throw an error
    // do stuff
});
</script>
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我在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)
    // ...
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么这会破坏,当jquery的"ready"函数内部发生错误时?

Gus*_*uss 8

我不知道为什么你有这个问题(它看起来很奇怪,我不认为它是一个问题,JQuery吃你的异常,因为你的警报(1)不会被解雇),但我确实想提到你的使用Error.stack - 当onerror调用事件时,您没有原始错误的堆栈上下文,因此在该点获取堆栈跟踪(通过捕获您自己的错误)将不会产生有意义的堆栈.

但回到一个真正的答案 - 而不是通过编写特定的损坏代码来模拟问题,以便你可以捕获错误,如何直接抛出错误?你的onerror处理程序的第一行可能是:

try { throw new Error("dummy"); } catch (e) { alert(e.stack); }
Run Code Online (Sandbox Code Playgroud)

这是有效的代码,更有可能不会给您带来问题.


Dar*_*con 1

最有可能的是 jQuery 将回调包装在自己的 try/catch 中并忽略错误。