【问题标题】:log errors with stack trace in javascript在 javascript 中使用堆栈跟踪记录错误
【发布时间】:2010-12-29 23:51:16
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    try { throw new Error("dummy"); } catch (e) { alert(e.stack); }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我不这么认为,因为如果我删除函数 catcherr() 中的 try{},则会引发错误。
      【解决方案3】:

      在 try/catch 中尝试不同的异常。 比如 a=1/0 或 baddarr[5]='bad' 看看这些是否触发异常。 有时,“未找到对象”错误可能是由于尚未加载对象造成的,并且对这些异常的处理可能与其他异常不同。

      【讨论】:

      • 那么不确定。非常神秘。你看过 jQuery 文件中的异常处理吗?
      猜你喜欢
      • 2011-04-06
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2014-08-12
      相关资源
      最近更新 更多