Node.js中的SyntaxError的行号
我有一些使用vm
模块和runInNewContext
函数的代码,并执行dynamic生成的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? } }
我想打印语法错误的行号,但我有两个问题:
- 我不知道如何识别exception是
SyntaxError
还是别的。instaceof
不起作用(更新 – 我可以使用e.name === "SyntaxError"
)。 - 即使我能够认出它,我怎么能得到行号呢? 可能吗?
提前致谢。
更新:我可以从e.stack
得到一些信息 – 然而,堆栈跟踪中最顶层的调用是runInNewContext
(使用它的行号),但是我仍然找不到code
的行号,导致exception( SyntaxError
) 。
1)使用if (e.name === "SyntaxError")
。
2)与错误相关的所有数据保存在e.stack
。
使用try / catch
将堆栈存储在全局variables中
logging沙箱
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));
这将logging:
{e:'ReferenceError:count没有定义\ n在myfile.vm:1:13 \ n …
现在你可以看到错误发生在myfile.vm的第13行,这仍然需要你在不同的地方放置一些try / cathc块,但是至less现在你可以得到反馈
编辑:
添加一个方法来检测运行代码中的语法错误
var acorn = require('acorn'); var src = "try{\n"+ " {" + " count += 1;\n"+ " }catch(err) {\n" + " e=err.stack\n" + "}"; var result = acorn.parse(src);
这样做会导致与“SyntaxError:意外的令牌(3:4)”,例如。 第3行,第4个字符是意想不到的标记,(额外{不应该在那里)
虽然stackedy
,但可以使用stackedy
模块 ,它可以帮助您处理堆栈跟踪。 但这并不是完美的解决scheme,因为显示的行号是函数调用中的行号,而不是源文件中的行号。
特别看一下这个简单的例子 :
index.js
var stackedy = require('stackedy'); var fs = require('fs'); var src = fs.readFileSync(__dirname + '/src.js'); var stack = stackedy(src, { filename : 'stax.js' }).run(); stack.on('error', function (err, c) { stack.stop(); console.log('Error: ' + err); var cur = c.current; console.log(' in ' + cur.filename + ' at line ' + cur.start.line); c.stack.forEach(function (s) { console.log(' in ' + s.filename + ', ' + s.functionName + '() at line ' + s.start.line ); }); });
src.js
function f () { g() } function g () { h() } function h () { throw new SyntaxError('woops') } f();
输出:
~/tmp ❯❯❯ node index.js Error: SyntaxError: woops in stax.js at line 2 in stax.js, h() at line 1 in stax.js, g() at line 0 in stax.js, f() at line 4
如注释中所述,您可以使用err.name === 'SyntaxError'
来检查错误types。
对于* nix:
if (err) console.log(err.stack.split('\n')[1]);
它会logging堆栈跟踪的第二行,出现错误的地方。
Windows或Mac可能需要其他拆分符号(取决于系统行尾)