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對象只包含一個方法:
- void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException;
無論 TemplateException 異常什么時候發生,這個方法都會被調用。
如果方法拋出異常,那么模板的執行就會中止,而且Template.process() 方法也會拋出同樣的異常。如果 handleTemplateException 對象不拋出異常,那么模板將會繼續執行,就好像什么也沒發生過一樣,但是引發異常的語句將會被跳過。
當TempalteExceptionHandler被調用前,FreeMarker將會記錄異常日志。
例如:
- 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本身帶有的預先編寫的錯誤控制器
- TemplateExceptionHandler.DEBUG_HANDLER —— 打印堆棧信息和重新拋出異常。這是默認的異常控制器
- TemplateExceptionHandler.HTML_DEBUG_HANDLER —— 和DEBUG_HANDLER相同,但是可以格式化堆棧跟蹤信息,HTML頁面,建議使用它而不是DEBUG_HANDLER
- TemplateExceptionHandler.IGNORE_HANDLER —— 簡單地壓制所有異常。它對處理異常沒有任何作用,也不會重新拋出異常
- TemplateExceptionHandler.RETHROW_HANDLER —— 簡單重新拋出所有異常而不會做其他的事情。這個控制器對Web應用很好,因為它在生成的頁面發生錯誤的情況下,給了對Web應用的更多的控制權