如何在抛出异常时获取JavaScript堆栈跟踪?

如果我自己抛出一个JavaScript异常(例如throw "AArrggg" ),我如何获得堆栈跟踪(以Firebug或其他方式)? 现在我只是收到消息。

编辑 :由于许多人下面已经发布,有可能得到一个JavaScript异常的堆栈跟踪,但我想获得一个堆栈跟踪我的异常。 例如:

function foo() {
    bar(2);
}
function bar(n) {
    if (n < 2)
        throw "Oh no! 'n' is too small!"
    bar(n-1);
}

当调用foo ,我想获得一个堆栈跟踪,其中包含对foobarbar的调用。


这段代码的修改版本可能会有所帮助:

function stacktrace() { 
  function st2(f) {
    return !f ? [] : 
        st2(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + f.arguments.join(',') + ')']);
  }
  return st2(arguments.callee.caller);
}


编辑2(2017):

在所有现代浏览器中,您只需调用: console.trace(); (MDN参考)

编辑1(2013):

在原始问题的评论中指出的更好(更简单)的解决方案是使用Error对象的stack属性,如下所示:

function stackTrace() {
    var err = new Error();
    return err.stack;
}

这会产生这样的输出:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

给出调用函数的名称以及URL,调用函数等等。


请注意,chromium / chrome(使用V8的其他浏览器)以及Firefox确实有一个方便的界面,用于通过Error对象上的堆栈属性获取堆栈跟踪。

try {
   // Code throwing an exception
} catch(e) {
  console.log(e.stack);
}

它适用于基本例外以及您自己抛出的例外。 (考虑到你使用了Error类,这是一个很好的习惯)。

查看V8文档的详细信息


在Firefox中,似乎你不需要抛出异常。 这足以做到

e = new Error();
console.log(e.stack);
链接地址: http://www.djcxy.com/p/14461.html

上一篇: How can I get a JavaScript stack trace when I throw an exception?

下一篇: Showing the stack trace from a running Python application