如果我自己抛出一个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的调用。
在谷歌Chrome(版本19.0及以上)中,简单地抛出异常就可以完美地工作。例如:
/* file: code.js, line numbers shown */
188: function fa() {
189: console.log('executing fa...');
190: fb();
191: }
192:
193: function fb() {
194: console.log('executing fb...');
195: fc()
196: }
197:
198: function fc() {
199: console.log('executing fc...');
200: throw 'error in fc...'
201: }
202:
203: fa();
将显示浏览器控制台输出的堆栈跟踪:
executing fa... code.js:189
executing fb... code.js:194
executing fc... cdoe.js:199
/* this is your stack trace */
Uncaught error in fc... code.js:200
fc code.js:200
fb code.js:195
fa code.js:190
(anonymous function) code.js:203
希望这对你有所帮助。
此填充代码在现代(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:包含导致异常的堆栈跟踪
我希望这能帮到你。
哇——我在6年里没有看到一个人建议我们在使用堆栈之前先检查它是否可用!在错误处理程序中,最糟糕的事情就是因为调用了不存在的东西而抛出错误。
正如其他人所说,虽然stack现在使用起来很安全,但在IE9或更早的版本中不受支持。
我记录我的意外错误和堆栈跟踪是相当必要的。为了获得最大的支持,我首先检查Error.prototype.stack是否存在并且是一个函数。如果是,那么使用error.stack是安全的。
window.onerror = function (message: string, filename?: string, line?: number,
col?: number, error?: Error)
{
// always wrap error handling in a try catch
try
{
// get the stack trace, and if not supported make our own the best we can
var msg = (typeof Error.prototype.stack == 'function') ? error.stack :
"NO-STACK " + filename + ' ' + line + ':' + col + ' + message;
// log errors here or whatever you're planning on doing
alert(msg);
}
catch (err)
{
}
};
编辑:似乎因为堆栈是一个属性而不是一个方法,你可以安全地调用它,即使在旧的浏览器。我仍然感到困惑,因为我非常确定检查错误。原型以前为我工作,现在它不-所以我不确定发生了什么。