当我抛出异常时,如何获取 JavaScript 堆栈跟踪?

2022-08-29 22:38:48

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

编辑:正如下面的许多人发布的那样,可以获取JavaScript异常的堆栈跟踪,但我想为我的异常获取堆栈跟踪。例如:

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

当调用时,我想获取一个堆栈跟踪,其中包括对 , 、 的调用。foofoobarbar


答案 1

编辑2(2017):

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

编辑1(2013):

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

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、其调用函数等。

原件(2009年):

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

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

Chrome/Chromium和其他使用V8的浏览器,以及Firefox,都有一个方便的界面,可以通过对象的属性获取堆栈跟踪:stackError

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

有关详细信息,请参阅 V8 文档