|
所有的异常都来自于一个对session bean方法封装的business delegator.
我在这个business delegator里调用Session bean的方法,并且把捕获的异常根据情况生成ErrorCode对象返回给web端.我现在的做法如下:
|
当有好多这样的方法时,代码看着有些urgly.但是每次捕获异常都要new一个ErrorCode,因为如果不new的话,客户端有可能得到的是上次调用的ErrorCode信息.我想问的是能不能通过模式或者一些设计改进一下这个代码.
|
|
所有的errorMessage都配置在外面的xml文件里,避免过多的hardcode。就依你的上下文来讲,个人建议是把ErrorCode类映射到一个errorMessage 的DTD或者schema,然后将来所有的code,name,description的值都从errorMessage.xml中获得,最好由这三个值创建出的ErrorCode实例传给程序抛出去,就可以了。这样的优点是避免硬编码和编码量增加,思想比较靠近AOP了。
SessionBeanFacade {
Map daoInstanceMap = new HashMap();
create(String className){
if(daoInstanceMap.containKey(className))
return ((DaoInterface)daoInstanceMap.get(className)).create();
else {
DaoInterface daoImp = ((DaoInterface)Class.forName(className).newInstance).create();
daoInstanceMap.put(class,NamedaoImp);
return daoImp.create();
}
}
update(){
..........
}
delete(){
.......
}
..........
都一样。
}
不知道能否给你有所启发。
如果我们每层都需要真正了解Exception的原因话,还是都抛出代表不同层错误的exception.当然,同样可以无论哪一层你都可以抛出同样的CommonException,最终到客户端。但这样不大好定位错误的地方和了解真正错误的信息。所以我们的做法是,定义好,各层的Exception。即持久层Exception,业务逻辑层Exception,代理层Exception,最终客户端catch的统一的Exception。但这样的缺点确实是Exception子类过多。不知道能否给你有用的信息,其他道友是否可以把个人的经验讲讲。
子问题:记录嵌套异常,完整的异常信息
在Web层和EJB层专门有一个DTO抽象,其中有一个setError字段,当Web层向后台传送DTO对象时,EJB在处理出错时,将对应出错编码字符串写入setError,Web从DTO获得结果,将Error编码提取出来,交由Struts出错机制处理。
例如在Struts的Application.propX中,有一段提示:
error.create.name=创建用户出错。
在EJB的createName方法的catch中,我是:
setError(Constants.E_C_N);
其中Constants.E_C_N的值是"error.create.name"。
前台Struts只要取出error编码,getError(),直接交由Struts显示出错信息即可。这样可以实现多语言出错显示。程序处理也比较模板化(傻瓜化)。