【问题标题】:Javascript eval() Exception - line numberJavascript eval() 异常 - 行号
【发布时间】:2011-03-30 04:11:17
【问题描述】:

在 JavaScript 中,我有一个 var str = ".a long string that contains many lines..."eval(str);引起的异常情况下

我想捕获它并打印导致异常的行号。 (str..内部的行)

有可能吗?

EDIT 作为 Alligator 项目 (http://github.com/mrohad/Alligator)(一个 JavaScript 应用服务器)的一部分,我正在从磁盘读取文件并 eval() 任何嵌套到 scriplet( )

我在浏览器之外运行这个脚本,使用 NodeJS(在 V8 之上)。

【问题讨论】:

  • 如果不将多行命令拆分为单独的指令和 eval() 调用,完全不确定是否可以做到这一点。
  • 一开始就使用“eval”非常难看。也许您可以描述一下您正在尝试做的事情,有人可能会有更好的主意。
  • 将 eval 拆分为多行的问题是,例如当你有 if(cond)
  • 我认为在 AJAX 时代,有人会想要解决这个问题。我有同样的problem
  • @MrOhad - 查看此 Google V8 问题code.google.com/p/v8/issues/detail?id=1914

标签: javascript exception eval node.js v8


【解决方案1】:

尝试将 try/catch 添加到字符串而不是 eval 周围:

var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}';

【讨论】:

  • 我认为它比我的解决方案更好,但我已经对其进行了测试,但它不起作用,与 try{} catch{} 不是 eval 的一部分相同的堆栈
  • 将此与@AndreyKo 的解决方案结合起来,您就有了一个适用于 Firefox 的解决方案
  • 如果字符串有语法错误也不起作用,因为 try/catch 甚至无法正确构造以捕获错误!
  • 问题是关于 NodeJS,这个答案不起作用e.lineNumberundefined 那里。
【解决方案2】:

1) 运行:

var javascript_offset; 尝试 { 未定义函数(); } 捕捉(ex1){ javascript_offset = ex1.lineNumber; } 尝试 { YOUR_STRING_WITH_JS } 捕捉(ex2){ var line_that_caused_it = ex2.lineNumber - javascript_offset -2; HANDLE_THE_EXCEPTION_HERE }

【讨论】:

  • 我在浏览器之外运行这个脚本,使用 NodeJS(在 V8 之上)
【解决方案3】:

我找到了一个效率很低的解决方案,但我只在 debug_mode==1 时使用它,所以还不错..

我将 eval_str 写入文件,“导入该文件,并在 try{}catch{} 中调用它,然后从堆栈跟踪中解析错误行...

在我的具体情况下,代码如下所示:

var errFileContent = "exports.run = "+evalStringAsAFunction+";";
fs.writeFile('/home/vadmin/Alligator/lib/debugging.js', errFileContent, function (err) {
    var debug = require('./debugging');
    try{
         debug.run(args...);
    }
    catch(er){
         log.debug(parseg(er));
    }
});

【讨论】:

  • 这是一种低效的 hack,但在 Google V8 支持此功能之前,它绝对是一种解决方法。不错,谢谢。
【解决方案4】:

这解决了你的问题?

try {
    eval(str);
} catch (e) {
    console.log(e.lineNumber)
}

【讨论】:

  • @MrOhad,Error 对象上的lineNumber 属性是非标准,它只适用于Mozilla 实现,但恐怕它会返回给你您调用 eval 的行号,而不是评估文本中的实际行号。
  • 适用于 Firefox,但不适用于其他浏览器。在 Chrome/Iron 中,您可以获得接近 e.stack 末尾的行号。
  • e.stack 没有返回 undefined 但它确实返回了 eval 的行而不是 eval 字符串内部的行
  • 你能说一下e包含什么吗?
  • 这个答案不正确。该问题询问您是否可以获取 eval 文本中的行号,而不是调用 eval() 的行号。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多