还有另一篇文章也写得非常好 同样不知道作者是谁
1. checked 和 unchecked exceptions
致命错误, 不可恢复错误, 第三方包错误 包装为unchecked exception。
业务逻辑异常流,安全异常包装为checked exception. J2ee应用中有Business exception,
DB exception, security exception, confirmation exception
2. 抛出异常的策略
2.1 采用J2EE应用程序的 前端控制器(front controller) 集中控制处理,开发者实现具体的
业务逻辑的时候可以不关心异常的捕捉
2.2 方法签名中throws 一个基类的异常。这样前端控制器中只要捕捉这个基类的异常,开发者
可以定义自己派生的异常具体类
3. 在web层处理unchecked exceptions
所有的unchecked exceptions 都应该在web层进行处理, 可以在web.xml中配置异常发生时显
示定制的错误页面。
4. 封装第三方包的所有异常(Exception)为一个我们定义的unchecked exception
5. 对来自数据库操作的checked exception
比如Employee not found, Order not found可以抽
象一个RecordNotFoundException. 至于这个RecordNotFoundException是因为Employee还是Order
引起的作为context, 由context一起组成error code,抛给前端控制器。
6. 前端控制器中的错误处理
基类的异常处理(应用模板方法设计模式 Template Method)和子类(实现业务)的部分代码如
下,以struts为例
public abstract class BaseAppDispatchAction
extends DispatchAction{
...
protected static ThreadLocal
expDisplayDetails = new ThreadLocal();
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
...
try{
String actionMethod = request
.getParameter(mapping.getParameter());
finalDestination =dispatchMethod(mapping,
form, request, response,actionMethod);
}catch (BaseAppException Ex) {
ExceptionDisplayDTO expDTO =
(ExceptionDisplayDTO)expDisplayDetails
.get();
IExceptionHandler expHandler =
ExceptionHandlerFactory
.getInstance().create();
ExceptionDTO exDto = expHandler
.handleException(
expDTO.getContext(), userId, Ex);
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError(exDto
.getMessageCode()));
saveErrors(request, errors);
return mapping.findForward(expDTO
.getActionForwardName());
} catch(Throwable ex){
//log the throwable
//throw ex;
} finally {
expDisplayDetails.set(null);
}
业务子类中代码如下:
...
String exceptionActionForward =
"SearchAdjustmentPage";
String exceptionContext =
"divisionAction.searchDivision";
ExceptionDisplayDTO expDTO =
new ExceptionDisplayDTO(expActionForward,
exceptionContext);
expDisplayDetails.set(expDTO);
...
DivisionDTO divisionDTO =divisionBusinessDelegate
.getDivisionByNum(fromDivisionNum);
...
ExceptionDisplayDTO 作为data transfer object放在ThreadLocal中专门为了父类的异常处理
用
7. Exception Handler
上面的集中异常控制是在Excepiton Handler中处理的,包括:
根据异常类型获取异常代码,异常代码会用来显示异常信息. 异常类型与异常代码的对应关系
可以放到一个XML文件中. 根据异常代码取异常信息可以由ResouceBundle来实现,这样同时解决了
异常信息国际化的问题. 两个异常配置的xml文件如下:
<exception name="EmployeeConfirmationException">
<messagecode>messagecode.employeeconfirmation</messagecode>
<confirmationind>true</confirmationind>
<loggingtype>nologging</loggingtype>
</exception>
<exception name="RecordNotFoundException">
<messagecode>messagecode.recordnotfound</messagecode>
<confirmationind>false</confirmationind>
<contextind>true</contextind>
<loggingtype>error</loggingtype>
</exception>
第二个异常文件考虑了我们上面讲的context问题. 如果抛出的异常是
RecordNotFoundException, 并且当前的context是order.getOrder , 那么error code就
是:messagecode.recordnotfound.order.getOrder
为了避免多次解析这个XML文件,可以实现一个ExceptionInfoCache ,启动应用时缓冲这个xml的内
容.
ExceptionHandler中handleException方法代码片断如下:
public ExceptionDTO handleException(String userId,
BaseAppException exp) {
ExceptionDTO exDTO = new ExceptionDTO();
ExceptionInfoCache ecache =
ExceptionInfoCache.getInstance();
ExceptionInfo exInfo = ecache
.getExceptionInfo(
ExceptionHelper.getClassName(exp));
String loggingType = null;
if (exInfo != null) {
loggingType = exInfo.getLoggingType();
exDTO.setConfirmation(exInfo
.isConfirmation());
exDTO.setMessageCode(exInfo
.getMessageCode());
}
FileLogger logger = new FileLoggerFactory()
.create();
logger.logException(exp, loggingType);
相关推荐
J2EE项目中统一异常处理,14类异常的自定义分析,支持dao层异常原因的返回
J2EE项目异常处理的几种方案 内有代码
随着J2EE应用系统业务逻辑日益复杂和规模不断扩大,传统的异常处理仅依赖Java异常处理机制,缺失层次性和分类性,存在异常处理散乱、扩展困难和异常日志混乱等问题。从J2EE应用系统架构的层次性着手,建立异常层次...
经典J2EE J2EE项目 项目案例 J2EE初学者参考
J2EE项目开发总结J2EE项目开发总结
J2EE项目开发模板 J2EE项目开发模板 J2EE项目开发模板 J2EE项目开发模板 J2EE项目开发模板 J2EE项目开发模板
本书汇集了大量企业级应用项目开发的经验,归纳了不同项目中使用的框架、模式、设计方法、开发方法,形成一个完整的技术体系和指导方法,以供用J2EE进行项目开发的初级人员和有一定经验的高级开发人员阅读。...
j2ee项目设计文档 商品进销存管理系统 图书馆管理信息系统 超市进销存管理系统等
这篇指南不是为J2EE服务器及工具供应商准备的,它没有解释如何实现J2EE结构,也没有解释J2EE软件包。J2EE规范描述了J2EE结构并可以从下面的网址下载: http://java.sun.com/j2ee/docs.html#specs
包含j2ee项目中用到的所有包,可以避免了到处查找的时间,省去部分不必要的麻烦
j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发...
J2EE项目开发与设计随书源码免费分享,喜欢的朋友欢迎自行下载
使用MyEclipse平台开发J2EE项目
J2EE java 项目 有完整的架构 作为学习的参考
规则引擎Drools在J2EE项目开发中的应用...
软件测试技术在J2EE项目中的应用(忘记谁给我得了)
j2ee6中文规范j2ee6中文规范j2ee6中文规范j2ee6中文规范
此项目为J2EE BS/CS项目 需要 :tomcat6.0f服务器 数据库 struts1/struts2动态库架包 myeclipse7.0集成开发工 链接串口连接数据库驱动 串口发短架包 GPRS模块等 运用了MVC三层架构开发模式 struts1/strts2结合...
教你一步一步的开发j2ee项目,包括spring,struts,hibernate 架构的使用
J2EE项目案例源代码及演示动画,非常适合初学者。