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

Jam*_*ong 17 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;
}
Run Code Online (Sandbox Code Playgroud)

如何判断错误发生在第二行?具体来说,我有兴趣在Firefox中这样做.

我知道错误对象e.stack在Mozilla浏览器中有,但输出似乎没有正确考虑换行.

mat*_*tyr 7

  • 经过验证的脚本中的行号从它所在的行开始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;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`e.lineNumber`是一种非标准的JavaScript功能. (2认同)
  • 这应该适用于哪些浏览器?Chrome没有`e.lineNumber`,Firefox 18没有为eval内容增加lineNumber-它们都指向eval调用. (2认同)

Fre*_*ger 5

全局错误事件侦听器将从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);
Run Code Online (Sandbox Code Playgroud)