如果我自己抛出一个JavaScript异常(例如,抛出“AArrggg”),我如何获得堆栈跟踪(在Firebug或其他)?现在我刚收到消息。
编辑:正如下面许多人发布的那样,可以为JavaScript异常获得堆栈跟踪,但我想为我的异常获得堆栈跟踪。例如:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
当调用foo时,我想获得一个堆栈跟踪,其中包括对foo, bar, bar的调用。
编辑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、它的调用函数等等。
原(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);
}
此填充代码在现代(2017)浏览器(IE11, Opera, Chrome, FireFox, Yandex)中工作:
printStackTrace: function () {
var err = new Error();
var stack = err.stack || /*old opera*/ err.stacktrace || ( /*IE11*/ console.trace ? console.trace() : "no stack info");
return stack;
}
其他答案:
function stackTrace() {
var err = new Error();
return err.stack;
}
不能在IE 11中工作!
使用arguments. called .caller -在任何浏览器中都不能在严格模式下工作!
在Firefox上比在IE上更容易获得堆栈跟踪,但从根本上来说,这是你想要做的:
将“有问题的”代码段包装在try/catch块中:
try {
// some code that doesn't work
var t = null;
var n = t.not_a_value;
}
catch(e) {
}
如果你要检查"error"对象的内容,它包含以下字段:
e.fileName:问题产生的源文件/页
e.lineNumber:出现问题的文件/页中的行号
message:描述发生错误类型的简单消息
e.name:发生错误的类型,在上面的例子中它应该是'TypeError'
e.stack:包含导致异常的堆栈跟踪
我希望这能帮到你。