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應用的更多的控制權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM