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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:35:08