【问题标题】:in javascript get the callstack that lead to error在javascript中获取导致错误的调用堆栈
【发布时间】:2012-03-11 00:37:19
【问题描述】:

问题通常是没有获取调用堆栈,可以按照此处所述完成: http://eriwen.com/javascript/js-stack-trace/ 而是从事件的处理程序访问触发事件的调用堆栈。

我特别感兴趣的是从窗口错误事件中记录调用堆栈

window.onerror = function(msg, url, line) { 
 //callstack // would be nice to have.
//log callstack or whatever. (note this can be done w/ ajax and service, and is not the question at hand.
}

但我确实知道如何记录错误。 (我用jquery的.ajax,还有一个服务)

浏览器会让这成为可能吗?目前有可能吗?也许我正在以错误的方式解决这个问题。如何添加一个简单的函数(即不修改我的代码库中的所有函数)以检测何时出现错误,并记录调用堆栈。

感谢到目前为止的回答,如果问题最初措辞不当,我们深表歉意。

【问题讨论】:

    标签: javascript error-handling callstack


    【解决方案1】:

    这在很大程度上取决于你想用调用堆栈做什么——也就是说,你所说的“记录调用堆栈或其他什么”是什么意思。

    出于安全原因,浏览器显然不太可能允许页面发出 javascript 指令以在本地计算机的硬盘驱动器上写入任意文件。

    您可以采用的几种可能性:

    1. 在 javascript 中构建调用堆栈,并将其作为详细的错误消息发送到服务器上的 AJAX 处理程序,您可以将错误保存在日志文件中。 (这假设您在服务器上至少有一些 cgi 访问权限)

    2. 使用 console.log() 将调用堆栈写入 javascript 控制台,假设有问题的浏览器支持它。 (写之前一定要测试console和console.log的存在。)

    3. 将调用堆栈写入一个隐藏的 div,您可以使用浏览器的开发工具对其进行调整以使其可见。

    4. 在 alert() 中打印调用堆栈。 (这对于开发人员来说可能很有用,但它对最终用户的干扰很大,因此您不希望在最终部署的代码中留下警报。)

    【讨论】:

    • 感谢您的彻底回复。我不认为日志记录是我的问题。问题是获取调用堆栈。日志记录将通过您的建议 1(ajax 和 web 服务)执行。不过还是谢谢。
    • 特别是,获取调用堆栈不是问题,它是从事件处理程序获取事件触发之前发生的调用堆栈。
    【解决方案2】:

    Error 对象在 Mozilla 上有一个非标准的 stack 属性,它似乎也适用于 Google Chrome,而不是 IE9。

    function test() {
      try {//can't think of anything that causes an exception?
          throw new Error("boo");
      }
      catch(e)
      {
          alert(e.stack);
      }
    }
    test();​
    

    见小提琴:http://jsfiddle.net/Cq5RJ/

    【讨论】:

    • +1 只是要发布一个 try/catch 将是你最好的选择。
    • 但是我怎样才能尝试/捕捉每个功能呢?我想我可以修改 Function.prototype 以某种方式包装在 try catch 块中?
    • 另外,谢谢,但是您可以从链接帽中看到我可以获取一般的调用堆栈。真正的问题是从事件处理程序获取导致事件被触发的调用堆栈。
    • 另外 +1 给 Bartosz Grzybowski,很高兴看到其他人也有类似的想法,但不幸的是,该主题自 2011 年 5 月以来一直没有被触及。
    • IE10 也增加了对Error.stack 的支持。 blogs.msdn.com/b/ie/archive/2012/05/10/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2015-12-27
    相关资源
    最近更新 更多