一、FreeMarker 常见的错误和异常介绍

当使用 FreeMarker 做为模版引擎的时候,可能发生的异常包括:
(1)配置异常:配置异常指的是 FreeMarker 初始化时发生的异常,例如错误的配置导致,该异常时由 FreeMarker 的 API 抛出来的。
(2)模版加载异常:模版加载异常可能是模版不存在或者没有读权限,或者是解析模版时发生错误,例如模版语法错误等。
(3)模版执行异常:模版执行异常是指模版已经成功的加载但在执行过程中由于代码执行错误所抛出的异常,这类异常一般都是用户的代码导致。

二、FreeMarker 错误和异常解决方案之一:自定义异常处理器

正常情况下,前两种异常会在开发过程中就会发现并得以解决,而第三种异常往往跟实际的运行环境和数据有关,例如由于某些数据不存在导致的空指针异常等等。因此第三种异常才是我们真正需要关心以及监控的。为此,FreeMarker 定义了一个统一的异常处理接口 TemplateExceptionHandler 。该接口只有一个方法如下:

void handleTemplateException(TemplateException te,
    Environment env,
    java.io.Writer out)

通过调用 cfg.setTemplateExceptionHandler 来使用自定义的异常处理方法。下面是一个简单的异常处理扩展的例子:

第一步:实现TemplateExceptionHandler接口

class MyTemplateExceptionHandler implements TemplateExceptionHandler 
{
    
    public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out) throws TemplateException 
    {
        try 
        {
            out.write("[ERROR: " + te.getMessage() + "]");
        } 
        catch (IOException e) 
        {
            throw new TemplateException("Failed to print error message. Cause: " + e, env);
        }
    }
}

第二步:设置异常处理器

cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());

三、FreeMarker 错误和异常解决方案之二:避免页面报错

reemarker文件如果出错,网站的前台页面会报出很明显的错误-焦黄的背景,血红的文字,很不利于用户体验的。如何修改这个问题呢?其实,如果不想把报错信息显示在页面上,可以进行如下操作:
(1)在classpath目录下建立freemarker.properties
(2)配置如下:template_exception_handler=ignore