错误代码的设计!

04-12-03 shipatrioc
是这样在系统中web端最终给客户的错误提示是根据这样一个class来显示的.

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

所有的异常都来自于一个对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;
        }
    }
  }
<p>

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

shipatrioc
2004-12-04 09:11
想到解决方案了,把ErrorCode继承Exception,然后BusinessDelegator抛出来应该就行了,这样一来web端还是要捕获一个检查性异常!其它人有好的解决方案没有?

nekesai
2004-12-04 13:32
我们的做法是这样的:

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

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

nekesai
2004-12-04 20:51
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(){

.......

}

..........

都一样。

}

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

猜你喜欢
2Go 1 2 下一页