如果我自己抛出一个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的调用。


当前回答

function stacktrace(){
  return (new Error()).stack.split('\n').reverse().slice(0,-2).reverse().join('\n');
}

其他回答

在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:包含导致异常的堆栈跟踪

我希望这能帮到你。

功能:

function print_call_stack(err) {
    var stack = err.stack;
    console.error(stack);
}

用例:

     try{
         aaa.bbb;//error throw here
     }
     catch (err){
         print_call_stack(err); 
     }

如果你有firebug,在脚本选项卡中有一个“所有错误”选项。一旦脚本到达断点,你可以查看firebug的堆栈窗口:

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

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

详见V8文档

即使抛出Error实例,也可以访问它的堆栈(Opera中的stacktrace)属性。问题是,你需要确保你使用了throw new Error(string)(不要忘记使用new而不是throw string)。

例子:

try {
    0++;
} catch (e) {
    var myStackTrace = e.stack || e.stacktrace || "";
}