TemplateExceptionHandler思考

在重构MeteorTL([url]http://www.meteortl.org[/url])的异常处理体系时,
对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?
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值