【问题标题】:Tracing the source line of an error in a Javascript eval在 Javascript eval 中跟踪错误的源代码行
【发布时间】:2011-04-01 09:53:28
【问题描述】:

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

【问题讨论】:

  • 你想要哪个“第二行”? eval 和评估字符串中的语法错误都在第 2 行。
  • 在上面显示的代码上下文中,是的。在封装在字符串中的代码的上下文中,没有。我希望像在文件中那样解析换行符,这样我就可以报告 eval'd 字符串中发生的行错误。

标签: javascript error-handling eval


【解决方案1】:
  • 评估脚本中的行号从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;
}

【讨论】:

  • 请注意e.lineNumber 是一个非标准的 JavaScript 功能。
  • "特别是我有兴趣在 Firefox 中这样做"
  • 完美!这正是我想要的。不幸的是,它依赖于行号之间的硬编码差异,但至少它有效。主要问题是,如果我在脚本上运行压缩程序,它将无法工作。无论如何,非常感谢。
  • 这应该在哪些浏览器中工作? Chrome 没有 e.lineNumber 并且 Firefox 18 没有增加 eval 内容的 lineNumber - 它们都指向 eval 调用。
  • 唯一支持提供lineNumber 的浏览器是 Firefox。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

全局错误事件监听器将从 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);

【讨论】:

  • 这是一个关于答案的问题吗?
【解决方案3】:

我认为你不能用 eval 可靠地做到这一点。但是,您可以这样做而不是 eval:

try {
    $("<script />").html(scriptSource).appendTo("head").remove();
} catch (e) {
    alert(e.lineNumber);
}

【讨论】:

  • 请翻译成非jquery?
  • 如果它只是创建一个脚本标签,并将该标签的来源设置为您的代码,这显然不起作用 - 脚本中的错误不会被捕获。
猜你喜欢
  • 2012-12-15
  • 2010-11-30
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多