27

在 JavaScript 中,我有一个var str = ".a long string that contains many lines..." In case of exception 这是由eval(str);

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

是否可以?

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

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

4

4 回答 4

5

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

var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}';
于 2010-08-15T20:53:04.107 回答
3

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
}
于 2010-08-15T20:21:16.597 回答
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));
    }
});
于 2010-08-15T21:07:42.443 回答
-1

这解决了你的问题?

try {
    eval(str);
} catch (e) {
    console.log(e.lineNumber)
}
于 2010-08-15T20:19:45.453 回答