You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJV代码生成中try-catch块实现报错的解决方法及官方文档查询

AJV代码生成中try-catch块实现报错的解决方法及官方文档查询

环境信息

  • Node.js v18.16.0
  • ajv: ^8.11.0

你在实现自定义isEven关键字时,使用try-catch块遇到了Error: CodeGen: "try" without "catch" and "finally"错误,下面分问题解答:


问题1:修复try-catch块的语法错误

你的代码里有两个核心问题导致了这个报错:

  1. 你在try回调中直接使用了throw new Error(...),这是在代码生成阶段(也就是执行ajv.addKeyword时)抛出错误,而不是将throw语句生成到最终的验证代码中。这会打断CodeGen的链式调用,导致它认为try块没有对应的catch。
  2. 错误的异常处理逻辑:schema的合法性校验应该生成到运行时代码里,而不是在代码生成阶段抛出。

修复后的代码如下:

ajv.addKeyword("isEven", {
  type: "number", // Applies to numbers
  code(cxt) {
    const { data, schema } = cxt;

    // Wrap validation code in a try-catch block
    cxt.gen.block(() => {
      cxt.gen
        .try(() => {
          if (schema === true) {
            // If schema is true, fail if the number is odd
            cxt.fail(_`${data} % 2 !== 0`);
          } else if (schema === false) {
            // If schema is false, always pass validation
            cxt.pass();
          } else {
            // 生成运行时抛出错误的代码,而不是在编译阶段直接throw
            cxt.gen.throw(_`new Error('"isEven" schema must be a boolean')`);
          }
        })
        .catch((e) => {
          // 处理运行时错误,正确引用catch变量的message属性
          cxt.fail(_`"Validation error in 'isEven': " + ${e}.message`);
        });
    });
  },
  errors: true, // Enable custom error messages
});

关键修改点:

  • 将直接throw new Error(...)替换为cxt.gen.throw(_new Error(...)):这会把抛出错误的逻辑生成到最终的验证代码中,而不是在代码生成阶段直接报错。
  • 确保try和catch的链式调用完整,没有被编译时的错误打断。

问题2:AJV代码生成的官方文档位置

AJV的官方文档中,关于自定义关键字代码生成的内容主要分布在两个地方:

  1. 自定义关键字章节:在AJV官方文档的「Custom Keywords」部分,专门有「Code Generation」子章节,讲解如何通过code方法实现自定义关键字,包括基本的CodeGen使用方式。
  2. CodeGen API参考:有单独的API文档详细列出CodeGen的所有方法(包括try、catch、throw等)的参数和使用规范,覆盖了代码生成的所有细节。

这些文档都是AJV官方维护的权威资料,能帮你系统理解代码生成的逻辑和语法。


备注:内容来源于stack exchange,提问作者Bear Bile Farming is Torture

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:08:05