在 JavaScript 中我有一个
var str = ".a long string that contains many lines..."
eval(str);
引起的异常情况
我想捕获它并打印导致异常的行号。 (str.. 内部的线)
可能吗?
编辑 作为 Alligator 项目 (http://github.com/mrohad/Alligator) 的一部分,JavaScript 的应用程序服务器,我正在从磁盘和 eval() 读取任何嵌套到 scriplet 的文件( < ? ? > )
我在浏览器外运行这个脚本,使用 NodeJS(在 V8 之上)。
尝试将 try/catch 添加到字符串而不是 eval 周围:
var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}';
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 }
我找到了一个效率很低的解决方案,但我只在 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));
}
});
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];
}
这解决了你的问题?
try {
eval(str);
} catch (e) {
console.log(e.lineNumber)
}