Javascript eval() 异常 - 行号

问题描述 投票:0回答:5

在 JavaScript 中我有一个

var str = ".a long string that contains many lines..."
eval(str);

引起的异常情况

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

可能吗?

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

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

javascript exception eval node.js v8
5个回答
5
投票

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

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

3
投票

1)运行:

var javascript_offset;
尝试 {
  undefined_function();
} 赶上(ex1){
  javascript_offset = ex1.lineNumber;
}
尝试 {
  YOUR_STRING_WITH_JS
} 抓住(ex2){
  var line_that_caused_it = ex2.lineNumber - javascript_offset -2;
  处理_THE_EXCEPTION_HERE
}

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

0
投票
replaceErrors(key, value) {
    if (value instanceof Error) {
      var error = {};
      Object.
        getOwnPropertyNames(value).
        forEach(function (key) {
          error[key] = value[key];
        });
      return error;
    }
    return value;
  }
const errorStr = JSON.stringify(error.stack, this.replaceErrors);
const regexp = 'your reg';
          let isHasLineNum = regexp.exec(errorStr);
          let lineNum
          if (isHasLineNum) {
            lineNum = isHasLineNum[0];
          }

-2
投票

这解决了你的问题?

try {
    eval(str);
} catch (e) {
    console.log(e.lineNumber)
}
© www.soinside.com 2019 - 2024. All rights reserved.