我有一些代码使用 vm
模块和 runInNewContext
函数并执行动态生成的 JavaScript 代码。 eval
基本上是一个更安全的选择。
代码(变量code
)可能包含语法错误,所以我想捕捉它们并打印一些有用的信息。
try {
vm.runInNewContext(code, sandbox, filename);
}
catch (e) {
if (e instanceof SyntaxError) { // always false
console.log(e.toString()); // "SyntaxError: Unexpected token ||" for example
console.log(e.line); // how to get the line number?
}
}
我想打印语法错误的行号,但是我有两个问题:
- 我不知道如何识别异常是
SyntaxError
还是别的什么。instaceof
不起作用(更新 - 我可以使用e.name === "SyntaxError"
)。 - 就算我能认出来,我怎么能得到行号呢?有可能吗?
提前致谢。
更新:我可以从 e.stack
获得一些信息 - 但是,堆栈跟踪中最顶层的调用是 runInNewContext
(及其行号),但我仍然code
中找不到行号,导致异常(SyntaxError
)。
最佳答案
使用 try/catch
将堆栈存储在全局变量中
记录沙盒
var util = require('util');
var vm = require('vm');
var sandbox = {e:null};
var src = 'try{count += 1;}catch(err) {e=err.stack}';
vm.runInNewContext(src , sandbox, 'myfile.vm');
console.log(util.inspect(sandbox));
这将记录:
{ e: 'ReferenceError: count is not defined\n at myfile.vm:1:13\n ...
现在您可以看到错误发生在 myfile.vm 的第 1 行字符 13 这仍然需要您在不同的地方放置一些 try/cathc block 但至少你现在可以得到反馈
编辑:
添加一种方法来检测正在运行的代码中的语法错误
var acorn = require('acorn');
var src = "try{\n"+
" {" +
" count += 1;\n"+
" }catch(err) {\n" +
" e=err.stack\n" +
"}";
var result = acorn.parse(src);
这样做会导致抛出异常 “语法错误:意外的 token (3:4)” 例如。第 3 行,字符 4 是意外标记,(不应该存在的额外 {)
关于javascript - Node.js 中 SyntaxError 的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570477/