在重构MeteorTL([url]http://www.meteortl.org[/url])的异常处理体系时,
对TemplateExceptionHandler的位置思索良久...
先帖几个相关类:
考虑的主要问题在于TemplateExceptionHandler应该放在哪,由谁管理?
选择一:
放在side包,因为引擎将包含相关数据的TemplateException抛出后,怎么处理TemplateException不再是引擎的职责,
但这样,就必需在:
org.meteortl.side.TemplateTool,
org.meteortl.side.servlet.TemplateServlet,
org.meteortl.side.jsp.TemplateTag,
org.meteortl.side.webwork.TemplateResult,
等周边集成类中都各自管理TemplateExceptionHandler
如:
选择二:
放入config包,因为用户期望在配置中指定相应处理器,
这样,应将Handler后缀改成Interceptor,表示引擎可以拦截TemplateException,
但异常在引擎什么位置拦截,拦截后怎么处理返回,都有待考虑,
如:
对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?
}
}