javascript - Node.js 中 SyntaxError 的行号

标签 javascript node.js exception v8

我有一些代码使用 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/

相关文章:

wpf - 如何将绑定(bind)错误转化为运行时异常?

c++ - LoadLibrary 失败 : First chance exception 0xC0000139 (DLL Not Found) - How to debug?

node.js - Sinon 没有对 module.exports stub

node.js - 导入 node.js 模块 - SyntaxError : Unexpected identifier

javascript - 确定页面是否尚未准备好

javascript - 数据访问 JS 函数

javascript - 如何从经纬度点获取城市名称?

exception - 为什么 Dynamics AX 中没有报告 CLR 异常?

javascript - JSON 中的时间序列数据

javascript - ReactJS:如何让组件在第一次渲染时调用方法?