在重构MeteorTL(
http://www.meteortl.org)的异常处理体系时,
对TemplateExceptionHandler的位置思索良久...
先帖几个相关类:
public class TemplateException extends RuntimeException {
private static final long serialVersionUID = 1L;
public TemplateException(TemplateSource templateSource, Range location) {
super();
this.templateSource = templateSource;
this.location = location;
}
public TemplateException(TemplateSource templateSource, Range location, String message) {
super(message);
this.templateSource = templateSource;
this.location = location;
}
public TemplateException(TemplateSource templateSource, Range location, Throwable cause) {
super(cause);
this.templateSource = templateSource;
this.location = location;
}
public TemplateException(TemplateSource templateSource, Range location, String message, Throwable cause) {
super(message, cause);
this.templateSource = templateSource;
this.location = location;
}
// 持有异常处理需要的数据 ------------
private TemplateSource templateSource;
public TemplateSource getTemplateSource() {
return templateSource;
}
private Range location;
public Range getLocation() {
return location;
}
}
public interface TemplateExceptionHandler {
void handleTemplateException(TemplateException exception) throws IOException;
}
public class ConsoleTemplateExceptionHandler implements TemplateExceptionHandler {
public void handleTemplateException(TemplateException exception) throws IOException {
// 向控制台输出异常信息,并指出其发生位置
}
}
public class HtmlTemplateExceptionHandler implements TemplateExceptionHandler {
// 页面输出端
private Writer output;
public HtmlTemplateExceptionHandler(Writer output) {
this.output = output;
}
public void handleTemplateException(TemplateException exception) throws IOException {
// 向页面输出端输出友好的HTML代码,如:用高亮显示出错代码行等
}
}
考虑的主要问题在于TemplateExceptionHandler应该放在哪,由谁管理?
选择一:
放在side包,因为引擎将包含相关数据的TemplateException抛出后,怎么处理TemplateException不再是引擎的职责,
但这样,就必需在:
org.meteortl.side.TemplateTool,
org.meteortl.side.servlet.TemplateServlet,
org.meteortl.side.jsp.TemplateTag,
org.meteortl.side.webwork.TemplateResult,
等周边集成类中都各自管理TemplateExceptionHandler
如:
TemplateExceptionHandler templateExceptionHandler = ...
try {
......
factory.getTemplate("xxx.mtl").render(context);
} catch (TemplateException e) {
templateExceptionHandler.handleTemplateException(e);
}
选择二:
放入config包,因为用户期望在配置中指定相应处理器,
这样,应将Handler后缀改成Interceptor,表示引擎可以拦截TemplateException,
但异常在引擎什么位置拦截,拦截后怎么处理返回,都有待考虑,
如:
public Template getTemplate(String name) throws IOException, TemplateException {
try {
return proxyFactory.getTemplate(name);
} catch (TemplateException e) {
templateExceptionHandler.handleTemplateException(e);
// 这里继续抛异常?还是返回null?
}
}
分享到:
相关推荐
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); Map, Object> dataModel = new HashMap(); dataModel.put("docTitle", "测试文档"); dataModel.put("docContent", "这是文档内容...
开发者还可以通过`TemplateLoader`自定义模板加载机制,或者使用`TemplateExceptionHandler`处理模板执行过程中的异常。 除了基本功能,Freemarker还提供了模板继承和导入功能,使得模板的复用和组织更加灵活。通过...
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); ``` ### 2. 数据模型(DataModel) 数据模型是Freemarker中用来传递给模版的数据结构。它可以是任何类型的Java对象,包括但不限于字符...
- **错误处理**:Freemarker提供异常处理机制,如`TemplateExceptionHandler`,可以定制错误处理方式。 - **调试模式**:开启调试模式,可以在模板错误时输出详细信息,方便定位问题。 8. **性能优化** - **缓存...
同时,可以利用Freemarker的`TemplateExceptionHandler`进行错误处理,或者使用`debug`模式进行模板调试。 通过以上步骤,你就可以在Java项目中利用Freemarker高效地生成Word文档了。记住,关键在于理解模板语言和...
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER); ``` - **加载模板**:除了默认的模板加载方式外,还可以自定义模板加载器。 - **异常处理**:设置异常处理策略,如 ...
- `freemarker.template.TemplateExceptionHandler`:处理模板执行时的异常。 在`d.service.freemarker-master`这个压缩包中,可能包含了`TemplateService`的实现代码,包括Java源文件、测试用例、配置文件以及示例...