在FreeMarker中发出错误信号

时间:2015-05-06 23:30:15

标签: java templates error-handling freemarker

情景:

  • 我有一个已修复的Java程序,它使用FreeMarker模板
  • 我是编写FreeMarker模板的人。
  • 在我的一个模板中,我想检查一个值,如果它超出范围,则向应用程序发出错误信号。

我该怎么做? attempt/recover机制与try/catch类似,但不等同于throw。 (stop指令除外)

4 个答案:

答案 0 :(得分:3)

您可以继承RuntimeExceptionTemplateException,然后将该异常抛出到模板中并将其捕获到Template.process之外。要抛出异常,您可以创建一个自定义指令,如:

public class ThrowMyExceptionDirective implements TemplateDirectiveModel {

    @Override
    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
            throws TemplateException, IOException {
        throw new MyTemplateException();
    }

}

将其添加到名为#import的数据模型(或Configuration"throwMyException"作为共享变量),然后在模板中添加:

<@throwMyException />

答案 1 :(得分:1)

您可以将对象传递到freemarker模板中。创建一个包含错误值的Signal对象。然后在模板中,当您想要返回错误时,请使用错误调用Signal对象上的set()方法。

然后,当freemarker从处理模板返回时,您的代码可以检查Signal对象是否返回错误。如有必要,它可以在此时抛出异常。

答案 2 :(得分:1)

看起来他们现在添加了这个:http://freemarker.org/docs/ref_directive_stop.html

<#stop>
<#stop reason>

答案 3 :(得分:0)

我正在使用FreeMarker,例如:

Template tpl = configuration.getTemplate(tplName, StandardCharsets.UTF_8.name());
Environment env = tpl.createProcessingEnvironment(myContextObject, out);
env.setOutputEncoding(StandardCharsets.UTF_8.name());
env.process();

我想停止/死于表达式中。所以我只是向myContextObject添加了一个方法:

public void die(final String reason) {
  throw new IllegalStateException(reason);
}

这允许您在模板中执行以下操作:

${die("Reason")}