2014-09-19 91 views
1

记录我有以下代码:Freemarker模板尝试/恢复错误不freemarker.runtime.attempt

<#attempt> 
    <#include "brands/custom.ftl"> 
<#recover> 
    <#include "brands/default.ftl"> 
</#attempt> 

当时的想法是有一个自定义模板时,它的面世,或默认时,它不是。据我所知,在一个尝试/恢复块内部产生的所有错误将记录为:freemarker.runtime.attempt根据this page,但它似乎没有,或似乎并非如此。

Logs template exceptions thrown during template processing, but caught by attempt/recover directives. Enable DEBUG severity to see the exceptions.

对于我来说,会生成以下错误:

freemarker.log.JDK14LoggerFactory$JDK14Logger error 
SEVERE: Template processing error: "Error reading included file brands/custom.ftl" 

Error reading included file brands/custom.ftl 
The problematic instruction: 
---------- 
==> include "brands/custom.ftl" [on line 5, column 9 in _header.ftl] 
in include "_header.ftl" [on line 2, column 1 in index.ftl] 
---------- 

Java backtrace for programmers: 
---------- 
freemarker.template.TemplateException: Error reading included file brands/custom.ftl 
at freemarker.core.Include.accept(Include.java:167) 
at freemarker.core.Environment.visit(Environment.java:221) 
at freemarker.core.MixedContent.accept(MixedContent.java:92) 
at freemarker.core.Environment.visit(Environment.java:221) 
at freemarker.core.Environment.visit(Environment.java:361) 
at freemarker.core.AttemptBlock.accept(AttemptBlock.java:73) 
at freemarker.core.Environment.visit(Environment.java:221) 
at freemarker.core.MixedContent.accept(MixedContent.java:92) 
at freemarker.core.Environment.visit(Environment.java:221) 
at freemarker.core.Environment.include(Environment.java:1508) 
at freemarker.core.Include.accept(Include.java:169) 
at freemarker.core.Environment.visit(Environment.java:221) 
at freemarker.core.MixedContent.accept(MixedContent.java:92) 
at freemarker.core.Environment.visit(Environment.java:221) 
at freemarker.core.Environment.process(Environment.java:199) 
at freemarker.template.Template.process(Template.java:259) 
at com.company.portal.http.Controller.processTemplate(Controller.java:586) 
at com.company.portal.http.Controller.guardedService(Controller.java:354) 
at com.company.portal.http.Controller.service(Controller.java:65) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
at com.radiadesign.catalina.session.RedisSessionHandlerValve.invoke(RedisSessionHandlerValve.java:26) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.FileNotFoundException: Template brands/custom.ftl not found. 
at freemarker.template.Configuration.getTemplate(Configuration.java:580) 
at freemarker.core.Environment.getTemplateForInclusion(Environment.java:1490) 
at freemarker.core.Include.accept(Include.java:157) 
... 41 more 

我如何使它所以它不会产生严重的错误?

+0

[文档说](http://freemarker.org/docs/ref_directive_attempt.html#ref.directive.attempt):“模板执行期间发生的错误被始终记录,即使它们发生的尝试块内“。 – Makoto 2014-09-19 15:28:08

+0

请看看[此页](http://freemarker.org/docs/pgui_misc_logging.html) - Eventhough所有错误始终记录,尝试/恢复的错误会被记录为freemarker.runtime.attempt和应该是在调试时可用。 – bimovidia 2014-09-19 15:44:30

回答

0

#attempt/#recover文档说:“模板执行期间发生的错误始终会被记录下来,即使它们发生在尝试块内部。 #recover捕获的例外是在“[DEBUG] freemarker.runtime.attempt”下登录的。也就是说,你不能使用#attempt/#recover来做正常的流量控制。它用于灾难恢复,就像什么时候出现故障一样,但不想失败整个页面,只显示一些错误指示符并继续。但是您仍然希望提醒系统管理员或获取错误日志的人员。

当你想达到什么的,有没有内置该指令。但是,在2.3.21 API(尚未出来... GitHub 2.3或2.3-gae头)中,Environment有一个Template getTemplateForInclusion(String name, String encoding, boolean parse, boolean ignoreMissing)方法 - 请注意最后一个参数。如果此方法返回非null,那么您可以继续使用include(Template),否则您可以尝试获取另一个模板。您可以使用TemplateDirectiveModel实现自定义指令。

顺便说一句,你确定这个逻辑是合理的?不能只是应用程序告诉模板什么是要包含的模板的名称? (我不喜欢是否一个逻辑取决于文件丢失,如果由于意外错误,甚至是因为错字而丢失了什么?现在模板不会失败并告诉你,只是退后一步并包含其他内容。默默地)

+0

你有一点与逻辑取决于缺少的文件。我试图做的是将逻辑保持在前端级别。我会重新考虑这个方法,看看我能否以不同的方式获得相似的结果。 – bimovidia 2014-09-20 00:13:48