• freeMarker异常处理


    https://blog.csdn.net/lyd135364/article/details/50826899

    转载自点击打开链接

     

    可能的异常

    关于FreeMarker发生的异常,可以分为如下几类:

    • 当加载和解析模板时发生异常:调用Configuration.getTemplate()方法,FreeMarker就要把模板文件加载到内存中然后来解析它。在这期间,有两种异常可能发生:
      • 因模板文件没有找到而发生的IOExceptio一场,或在读取文件时发生其他I/O问题。比如没有读取权限,或者磁盘错误。
      • 根据FTL语言的规则,模板文件发生语法错误时会导致freemarker.core.ParseException一场。当获得Template对象(Configuration.getTemplate)时,这种错误就会发生,而不是执行(Template.process)模板的时候。这种异常是IOException异常的一个子类。
    • 当执行模板时发生的异常,也就是当调用了Template.process()方法时会发生的两种异常:
      • 当试图写入输出对象时发生错误而导致的IOException异常
      • 当执行模板时发生的其他问题而导致的freemarker.template.TemplateException异常。比如,当模板引用一个不存在的变量。在默认情况下,当TempalteException异常发生时,FreeMarker会用普通文本格式在输出中打印出FTL的错误信息和堆栈跟踪信息。然后再次抛出TemplateException异常而中止模板的执行,然后就可以捕捉到Tempalte.process()方法抛出的异常了。这种行为是可以定制的。

    异常处理器 TemplateExceptionHandler

    TemplateException 异常在模板处理期间的抛出是由 freemarker.template.TemplateExceptionHandler 对象控制的,这个对象可以使用 setTemplateExceptionHandler() 方法配置到 Configuration 对象中。

    TemplateExceptionHandler对象只包含一个方法:

    [html] view plain copy
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException;  

    无论 TemplateException 异常什么时候发生,这个方法都会被调用。

    如果方法抛出异常,那么模板的执行就会中止,而且Template.process() 方法也会抛出同样的异常。如果 handleTemplateException 对象不抛出异常,那么模板将会继续执行,就好像什么也没发生过一样,但是引发异常的语句将会被跳过。

    当TempalteExceptionHandler被调用前,FreeMarker将会记录异常日志。

    例如:

    [html] view plain copy
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. class MyTemplateExceptionHandler implements TemplateExceptionHandler {  
    2.     public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out)  
    3.     throws TemplateException {  
    4.         try {  
    5.             out.write("[ERROR: " + te.getMessage() + "]");  
    6.         } catch (IOException e) {  
    7.             throw new TemplateException("Failed to print error message. Cause: " + e, env);  
    8.         }  
    9.     }  
    10. }  
    11. ...  
    12. cfg.setTemplateExceptionHandler(new MyTemplateExceptionHandler());  

    FreeMarker本身带有的预先编写的错误控制器

    • TemplateExceptionHandler.DEBUG_HANDLER —— 打印堆栈信息和重新抛出异常。这是默认的异常控制器
    • TemplateExceptionHandler.HTML_DEBUG_HANDLER —— 和DEBUG_HANDLER相同,但是可以格式化堆栈跟踪信息,HTML页面,建议使用它而不是DEBUG_HANDLER
    • TemplateExceptionHandler.IGNORE_HANDLER —— 简单地压制所有异常。它对处理异常没有任何作用,也不会重新抛出异常
      • TemplateExceptionHandler.RETHROW_HANDLER —— 简单重新抛出所有异常而不会做其他的事情。这个控制器对Web应用很好,因为它在生成的页面发生错误的情况下,给了对Web应用的更多的控制权
  • 相关阅读:
    在Ubuntu/Centos使用 Let's Encrypt 证书部署 HTTPS的方法
    Ubuntu14.04安装配置LAMP环境(php5.6)
    centos6 php5.4 升級到php 5.6
    为自己的2017年定个计划
    收益的一些话
    学习瓦力部署系统的项目配置和上线部署
    统计进仓和出仓数量随时间变化的剩余数量流程图
    Codeigniter 获取当前的控制器名称和方法名称
    [记]Windows 系统下设置Nodejs NPM全局路径
    [记]Cordova安装插件选择插件版本
  • 原文地址:https://www.cnblogs.com/linus-tan/p/12597187.html
Copyright © 2020-2023  润新知