在JavaScript中我有一个var str = ".a long string that contains many lines..."
如果由eval(str);
我想抓住它并打印导致异常的行号。 (str的内部行...)
有可能吗?
编辑作为Alligator项目(http://github.com/mrohad/Alligator)的一部分,我是JavaScript的应用程序服务器,我正在从磁盘读取文件,eval()嵌套到scriplet的任何东西( <?>)
我在浏览器外部使用NodeJS(在V8之上)运行此脚本。
答案 0 :(得分:6)
尝试将try / catch添加到字符串而不是eval:
var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}';
答案 1 :(得分:3)
1)运行:
var javascript_offset; try { undefined_function(); } catch(ex1) { javascript_offset = ex1.lineNumber; } try { YOUR_STRING_WITH_JS } catch (ex2) { var line_that_caused_it = ex2.lineNumber - javascript_offset -2; HANDLE_THE_EXCEPTION_HERE }
答案 2 :(得分: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));
}
});
答案 3 :(得分:-1)
这可以解决您的问题吗?
try {
eval(str);
} catch (e) {
console.log(e.lineNumber)
}