如果我自己抛出一个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, Opera, Firefox和IE10+提供堆栈跟踪(作为字符串数组)
function getStackTrace () {
var stack;
try {
throw new Error('');
}
catch (error) {
stack = error.stack || '';
}
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
用法:
console.log(getStackTrace().join('\n'));
它从堆栈中排除了自己的调用以及Chrome和Firefox(但不包括IE)使用的标题“Error”。
它不应该崩溃在旧的浏览器,而只是返回空数组。如果你需要更通用的解决方案,请查看stacktrace.js。它支持的浏览器列表确实令人印象深刻,但在我看来,对于它所打算执行的小任务来说,它太大了:37Kb的精简文本,包括所有依赖项。
在谷歌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
希望这对你有所帮助。
在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:包含导致异常的堆栈跟踪
我希望这能帮到你。