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块的语法错误
你的代码里有两个核心问题导致了这个报错:
- 你在
try回调中直接使用了throw new Error(...),这是在代码生成阶段(也就是执行ajv.addKeyword时)抛出错误,而不是将throw语句生成到最终的验证代码中。这会打断CodeGen的链式调用,导致它认为try块没有对应的catch。 - 错误的异常处理逻辑: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的官方文档中,关于自定义关键字代码生成的内容主要分布在两个地方:
- 自定义关键字章节:在AJV官方文档的「Custom Keywords」部分,专门有「Code Generation」子章节,讲解如何通过
code方法实现自定义关键字,包括基本的CodeGen使用方式。 - CodeGen API参考:有单独的API文档详细列出
CodeGen的所有方法(包括try、catch、throw等)的参数和使用规范,覆盖了代码生成的所有细节。
这些文档都是AJV官方维护的权威资料,能帮你系统理解代码生成的逻辑和语法。
备注:内容来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

