`
javatar
  • 浏览: 1704582 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

TemplateExceptionHandler思考

    博客分类:
  • HTTL
阅读更多
在重构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?
	}
}
分享到:
评论

相关推荐

    JavaPDF生成文档的总结及相关代码,Java生成PDF

    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); Map, Object> dataModel = new HashMap(); dataModel.put("docTitle", "测试文档"); dataModel.put("docContent", "这是文档内容...

    freemarker-2.3.23-中文手册.zip

    开发者还可以通过`TemplateLoader`自定义模板加载机制,或者使用`TemplateExceptionHandler`处理模板执行过程中的异常。 除了基本功能,Freemarker还提供了模板继承和导入功能,使得模板的复用和组织更加灵活。通过...

    freemarker\Freemarker教程_中文版

    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); ``` ### 2. 数据模型(DataModel) 数据模型是Freemarker中用来传递给模版的数据结构。它可以是任何类型的Java对象,包括但不限于字符...

    freemarker中文学习资料

    - **错误处理**:Freemarker提供异常处理机制,如`TemplateExceptionHandler`,可以定制错误处理方式。 - **调试模式**:开启调试模式,可以在模板错误时输出详细信息,方便定位问题。 8. **性能优化** - **缓存...

    java 生成word

    同时,可以利用Freemarker的`TemplateExceptionHandler`进行错误处理,或者使用`debug`模式进行模板调试。 通过以上步骤,你就可以在Java项目中利用Freemarker高效地生成Word文档了。记住,关键在于理解模板语言和...

    freemarker教程

    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER); ``` - **加载模板**:除了默认的模板加载方式外,还可以自定义模板加载器。 - **异常处理**:设置异常处理策略,如 ...

    d.service.freemarker:Freemarker模板服务实现

    - `freemarker.template.TemplateExceptionHandler`:处理模板执行时的异常。 在`d.service.freemarker-master`这个压缩包中,可能包含了`TemplateService`的实现代码,包括Java源文件、测试用例、配置文件以及示例...

Global site tag (gtag.js) - Google Analytics