引发异常时如何获取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

Pro十三2020/03/12 17:26:45

Using console.error(e.stack) Firefox only shows the stacktrace in logs, Chrome also shows the message. This can be a bad surprise if the message contains vital information. Always log both.

Itachi猪猪2020/03/12 17:26:45

I had to investigate an endless recursion in smartgwt with IE11, so in order to investigate deeper, I needed a stack trace. The problem was, that I was unable to use the dev console, because the reproduction was more difficult that way.
Use the following in a javascript method:

try{ null.toString(); } catch(e) { alert(e.stack); }
StafanDavaid2020/03/12 17:26:45

功能:

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

用例:

     try{
         aaa.bbb;//error throw here
     }
     catch (err){
         print_call_stack(err); 
     }
凯飞云2020/03/12 17:26:45

Eugene答案的更新:必须抛出错误对象,以便IE(特定版本?)填充stack属性。以下内容应比其当前示例更好,并且应避免undefined在IE中返回

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

注1:这种事情仅应在调试时完成,而在实时运行时应禁用,尤其是在频繁调用时。注意2:可能无法在所有浏览器中使用,但似乎可以在FF和IE 11中使用,正好适合我的需求。

小宇宙西里2020/03/12 17:26:44

此polyfill代码可在现代(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.callee.caller-在任何浏览器中都不能在严格模式下使用!

小小小胖2020/03/12 17:26:44

在Chrome浏览器中,您可以使用以下console.trace方法:https : //developer.chrome.com/devtools/docs/console-api#consoletraceobject

Winter2020/03/12 17:26:44

在Firefox中,似乎不需要引发异常。做就足够了

e = new Error();
console.log(e.stack);
Eva达蒙2020/03/12 17:26:44

请注意,chrome / chrome(其他使用V8的浏览器)以及Firefox确实具有方便的界面,可通过Error对象stack属性获取stacktrace

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

它适用于基本异常以及您自己抛出的异常。(考虑使用Error类,这是一个好习惯)。

查看有关V8文档的详细信息

路易Pro2020/03/12 17:26:44

您可以访问实例stackstacktrace在Opera中)属性,Error即使您将其扔了也可以。关键是,您需要确保使用throw new Error(string)(不要忘记使用新的而不是throw string

例:

try {
    0++;
} catch (e) {
    var myStackTrace = e.stack || e.stacktrace || "";
}
ProTony2020/03/12 17:26:44

我不认为您可以使用任何内置功能,但是我确实找到了很多人在做自己的事情的例子。

凯老丝2020/03/12 17:26:44

如果您有萤火虫,则脚本标签中的所有错误选项都会中断。脚本到达断点后,您可以查看firebug的堆栈窗口:

屏幕截图