我正在异步构建包含javascripts的东西,这是有效的,但我正在寻求改进错误检测(因此所有错误似乎都不是来自AJAX调用附近的某些行把它们拉下来。
如果我使用eval来评估多行javascript文件,有没有办法追踪错误发生在哪一行?
通过在包含时保持对我需要的变量的引用,我可以确定错误发生在哪个文件中。我的问题是确定错误发生在哪个行。
示例:
try {
eval("var valid_statement = 7; \n invalid_statement())))");
} catch(e) {
var err = new Error();
err.message = 'Error in Evald Script: ' + e.message;
err.lineNumber = ???
throw err;
}
如何判断错误发生在第二行? 具体来说,我有兴趣在Firefox中这样做。
我知道错误对象在Mozilla浏览器中有e.stack
,但输出似乎没有正确考虑换行。
答案 0 :(得分:8)
eval
所在的行号开始。就像......
try {
eval('var valid_statement = 7; \n invalid_statement())))');
} catch(e) {
var err = e.constructor('Error in Evaled Script: ' + e.message);
// +3 because `err` has the line number of the `eval` line plus two.
err.lineNumber = e.lineNumber - err.lineNumber + 3;
throw err;
}
答案 1 :(得分:4)
全局错误事件监听器将从eval捕获异常并显示正确的行号(可能不在所有浏览器中):
window.addEventListener('error', function(e) {
console.log(e.message
, '\n', e.filename, ':', e.lineno, (e.colno ? ':' + e.colno : '')
, e.error && e.error.stack ? '\n' : '', e.error ? e.error.stack : undefined
);
}, false);
答案 2 :(得分:1)
我认为你不能可靠地使用eval。但是,你可以这样做而不是eval:
try {
$("<script />").html(scriptSource).appendTo("head").remove();
} catch (e) {
alert(e.lineNumber);
}