在Javascript eval中跟踪错误的源代码行

时间:2010-08-19 22:50:33

标签: javascript error-handling eval

我正在异步构建包含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,但输出似乎没有正确考虑换行。

3 个答案:

答案 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);
}