情景:
我该怎么做? attempt/recover
机制与try/catch
类似,但不等同于throw
。 (stop
指令除外)
答案 0 :(得分:3)
您可以继承RuntimeException
或TemplateException
,然后将该异常抛出到模板中并将其捕获到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")}