在JavaScript中捕获/处理异常时,如何确定异常发生时调用堆栈的内容? (如果可能的话,行号是什么)
try
{
// etc...
}
catch (ex)
{
// At this point here I want to be able to print out a detailed exception
// message, complete with call stack, and if possible line numbers.
}
答案 0 :(得分:16)
每个浏览器都以不同方式处理,因此没有通用的方法。 This blog post有一些很好的代码可以为大多数支持的浏览器转储堆栈跟踪。我认为没有一种提供行号的好方法。
如果您希望特别调试一个函数,Firebug具有良好的堆栈跟踪功能(访问console.trace())。
答案 1 :(得分:14)
查看this。
分析可用信息的方法:
try
{
doInit();
} catch(err)
{
var vDebug = "";
for (var prop in err)
{
vDebug += "property: "+ prop+ " value: ["+ err[prop]+ "]\n";
}
vDebug += "toString(): " + " value: [" + err.toString() + "]";
status.rawValue = vDebug;
}
答案 2 :(得分:1)
我发现在IE下运行的JavaScript中,捕获异常时无法捕获堆栈跟踪。根据{{3}} PDF,在IE中获取堆栈跟踪的唯一方法是,如果您不处理异常。
答案 3 :(得分:0)
对于大多数错误,您可以检查堆栈跟踪,其中将包括错误位置的行号和列号:
try {
throw new Error('foo');
} catch(e) {
console.log(e.message);
console.log(e.stack);
const [, lineno, colno] = e.stack.match(/(\d+):(\d+)/);
console.log('Line:', lineno);
console.log('Column:', colno);
}
第 13 行是正确的,因为这是来自 stacksnippets.net 的响应中错误来自 HTML 中的行:
请注意,这对于抛出的非错误不起作用,例如 throw null
或 throw 'foo'
(正是因为这个原因,不推荐使用)。