JiveJdon Community Forums
在线124人 Home | 论坛 | 培训咨询 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 8 回复 / 1 页 [ ]  发表新帖子  回复该主题贴
shipatrioc

发表文章: 26
注册时间: 2003年08月05日 16:58
给他发消息
错误代码的设计! 发表: 2004年12月03日 20:04 回复
是这样在系统中web端最终给客户的错误提示是根据这样一个class来显示的.

public class ErrorCode {
/**错误代码*/
private String code;
/**错误名称*/
private String name;
/**错误描述*/
private String description;
//Other setter/getter method of the fields above
......
}

所有的异常都来自于一个对session bean方法封装的business delegator.
我在这个business delegator里调用Session bean的方法,并且把捕获的异常根据情况生成ErrorCode对象返回给web端.我现在的做法如下:


public class MyBusinessDelegator {
private ErrorCode errorCode;
public ErrorCode getErrorCode () {
return this.errorCode;
}
public String getWeight (String name) {
try {
return invoiceSetting.getWeight( name);
} catch (BusinessException ge) {
errorCode = new ErrorCode ();
//-------
errorCode.setCode (
"2000");
errorCode.setName (
"该人员不存在");
errorCode.setDescription (
"该人员不存在");
return null;
} catch (RemoteException re) {
errorCode = new ErrorCode ();
//-------
errorCode.setCode (
"2000");
errorCode.setName (
"系统错误");
errorCode.setDescription (
"系统错误");
return null;
}
}
}

当有好多这样的方法时,代码看着有些urgly.但是每次捕获异常都要new一个ErrorCode,因为如果不new的话,客户端有可能得到的是上次调用的ErrorCode信息.我想问的是能不能通过模式或者一些设计改进一下这个代码.
shipatrioc

发表文章: 26
注册时间: 2003年08月05日 16:58
给他发消息
Re: 错误代码的设计! 发表: 2004年12月04日 09:11 回复
想到解决方案了,把ErrorCode继承Exception,然后BusinessDelegator抛出来应该就行了,这样一来web端还是要捕获一个检查性异常!其它人有好的解决方案没有?
nekesai

发表文章: 45
注册时间: 2004年10月29日 23:43
给他发消息
Re: 错误代码的设计! 发表: 2004年12月04日 13:32 回复
我们的做法是这样的:

所有的errorMessage都配置在外面的xml文件里,避免过多的hardcode。就依你的上下文来讲,个人建议是把ErrorCode类映射到一个errorMessage 的DTD或者schema,然后将来所有的code,name,description的值都从errorMessage.xml中获得,最好由这三个值创建出的ErrorCode实例传给程序抛出去,就可以了。这样的优点是避免硬编码和编码量增加,思想比较靠近AOP了。
shipatrioc

发表文章: 26
注册时间: 2003年08月05日 16:58
给他发消息
Re: 错误代码的设计! 发表: 2004年12月04日 14:21 回复
呵呵,关于错误信息的存放我觉得可以这样,把初始化错误代码的过程放到一个stack block里,效率应该高些,缺点就是维护错误信息还是要到代码里去维护.另外一个疑问时我们一般再在Sesseion Bean里定义好多checked Exception,然后在Business Delegator里来捕获,然后进行错误代码的封装到一个公共的CommonException里,再抛到前台比如structs action里,最终反馈给用户一个错误页面.我觉得是不是可以直接在Sesseion Bean里抛出这个CommonException(里面有错误代码的信息),这样可是可以省略好多Exception Class.这样做有什么缺点吗?
nekesai

发表文章: 45
注册时间: 2004年10月29日 23:43
给他发消息
Re: 错误代码的设计! 发表: 2004年12月04日 20:51 回复
stateless session如果是做为facade的话,增删改查可以每个表对应每个DAO,统一通过做为facade的stateless session来进行调用各个Dao来执行操作。stateless session中只要传如对应的Dao 类名就行了。

ADao impletements DaoInterface{
create()
update();
delete();
findByPrymaryK**();
}
BDao impletements DaoInterface{
create()
update();
delete();
findByPrymaryK**();
}

SessionBeanFacade {

Map daoInstanceMap = new HashMap();
create(String className){
if(daoInstanceMap.containK**(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(){
.......
}
..........
都一样。
}

不知道能否给你有所启发。
nekesai

发表文章: 45
注册时间: 2004年10月29日 23:43
给他发消息
Re: 错误代码的设计! 发表: 2004年12月04日 21:05 回复
哈哈,不好意思,回复弄错了。

如果我们每层都需要真正了解Exception的原因话,还是都抛出代表不同层错误的exception.当然,同样可以无论哪一层你都可以抛出同样的CommonException,最终到客户端。但这样不大好定位错误的地方和了解真正错误的信息。所以我们的做法是,定义好,各层的Exception。即持久层Exception,业务逻辑层Exception,代理层Exception,最终客户端catch的统一的Exception。但这样的缺点确实是Exception子类过多。不知道能否给你有用的信息,其他道友是否可以把个人的经验讲讲。
Kidwish

发表文章: 32
注册时间: 2003年08月18日 11:10
给他发消息
Re: 错误代码的设计! 发表: 2004年12月05日 10:44 回复
看看Hibernate的异常出理,能对你有所启发和帮助!由于代码比较多,不能贴出来。核心解释如何处理checked exception和runtime exception!

子问题:记录嵌套异常,完整的异常信息
ljshan

发表文章: 15
注册时间: 2004年11月29日 14:18
给他发消息
Re: 错误代码的设计! 发表: 2004年12月06日 10:02 回复
异常也是接口的一个组成部分,建议采用语言本身的异常处理机制,使用特定的异常类型(当然异常本身可以封装许多信息),每个层定义一套异常类型,对于层与层之间的异常类型定义他们之间的映射关系。我的观点是,能简单最好别复杂(simple but not simpler)。
banq

发表文章: 9074
注册时间: 2002年08月03日 17:08
给他发消息
Re: 错误代码的设计! 发表: 2004年12月08日 16:57 回复
我的个人经验是:

在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显示出错信息即可。这样可以实现多语言出错显示。程序处理也比较模板化(傻瓜化)。

这个主题有 8 回复 / 1 页 [ ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam