jdon 解惑授道,企业信息化解决之道
 

热点Tag: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts

Jdon框架演示

JiveJdon3.0
源码下载

GoF设计模式

在线教程

社区精彩讨论












错误代码的设计!

作者:shipatrioc 发表时间:2004年12月03日 20:04 回复此消息回复

原贴网址: http://www.jdon.com/jivejdon/thread/18039.html

是这样在系统中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信息.我想问的是能不能通过模式或者一些设计改进一下这个代码.

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

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

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

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

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

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

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(){
.......
}
..........
都一样。
}

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

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

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

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

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

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

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

在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 页 [ ]
 
上一篇: jpetstore的一段代码,请高手解释.. 下一篇: [请教]哪些设计模式是为了实现“多态”
 
查询本论坛 最热门帖子
快速发表回复:
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 
联系我们 | 关于我们 | RSS订阅 | 广告联系 | 网站地图 | 设为首页
Copyright (C) 2002-2007 Jdon.com, All Rights Reserved 版权所有 上海解道计算机技术有限公司
沪ICP备05018152号 如有意见请与我们联系 Powered by JdonFramework