如何让Scriban解析模板时忽略错误并实现部分格式化?
Scriban 实现错误忽略式部分模板渲染
问题场景
当使用Scriban解析包含错误的模板(如{{foo}} {{bar.}},其中{{bar.}}是无效语法)时,默认会直接抛出InvalidOperationException或ScriptRuntimeException,现有try-catch方案会返回未替换的完整原模板,无法实现"正确部分替换、错误部分保留/标记"的需求,且不能修改用户编写的模板。
解决方案
通过自定义TemplateContext的错误处理逻辑,让Scriban遇到错误时继续渲染,同时对错误节点做自定义输出:
using Scriban; using Scriban.Runtime; using Scriban.Syntax; public string RenderPartialTemplate(string templateInput, object dataVariables) { // 解析模板 var template = Template.Parse(templateInput); // 初始化自定义上下文 var context = new TemplateContext { // 设置错误模式为继续渲染,不终止 ErrorMode = ErrorMode.Continue, // 自定义错误处理回调 OnError = (ctx, errorMsg, errorSpan, exception) => { // 获取错误对应的原模板片段 var errorSegment = templateInput.Substring(errorSpan.Start, errorSpan.Length); // 输出原错误标签,若要替换为ERROR则改成 ctx.Output.Write("ERROR") ctx.Output.Write(errorSegment); // 返回true表示已处理错误,不再抛出异常 return true; } }; // 绑定变量到上下文 context.PushGlobal(dataVariables); // 执行渲染并返回结果 return template.Render(context); }
代码说明
- ErrorMode.Continue:强制Scriban遇到错误时不中断渲染流程,继续处理后续有效模板节点
- OnError回调:捕获每个错误事件,通过
errorSpan定位错误在原模板中的位置,提取原错误片段并写入输出,实现错误部分保留;若需要标记错误,直接替换写入内容为"ERROR"即可 - 无需修改模板:所有逻辑在代码层完成,不影响用户编写的原始模板
测试示例
调用RenderPartialTemplate("{{foo}} {{bar.}}", new { foo = 1 }),会返回1 {{bar.}};若将回调中的输出改为"ERROR",则返回1 ERROR。
内容的提问来源于stack exchange,提问作者RoadieRich
相关产品推荐
相关产品推荐

