论坛首页 Java企业应用论坛

提问:一个类的方法应该使用返回值来标识执行状态,还是抛出异常?

浏览 5801 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-19  
OO
在一般的java三层架构中(WEB层<---->Service层<--->DAO层)中,
Web 层的acion(如果使用Struts框架)通过调用Service的方法来处理用户提交的请求,
那么在action中既可以通过捕获Service层实现类的方法抛出的异常来转发不同的页面来给用户,
也通过使用if--else判断来判断Service层实现类的方法的返回值标识来转发不同的页面来给用户.

例如:


实现一:
接口的声明:
public interface UserManager{
 
   public boolean checkedUserExisted(User user);
}

实现类:
public class  UserManagerImp{
   public boolean checkedUserExisted(User user){
      //伪代码
    if(user存在){
         return  true;
      }
      else{
       return false;
      }

    }
}
那么在 web层action中当调用checkedUserExisted()方法可以这样实现:
 
   if(umImp.checkedUserExisted()){
       //转发用户已存在页面
   }
   else{
        //用户名合法
   }

实现二:
接口的声明:
public interface UserManager{
 
   public void checkedUserExisted(User user) throws UserExisedException;
}

实现类:
public class  UserManagerImp{
   public void checkedUserExisted(User user) throws UserExisedException{
       //伪代码
      if(用户已存在){
           throw new UserExisedException();
        }

    }
}

那么在 web层action中当调用checkedUserExisted()方法时可以通过:
  try{
     umImp,checkedUserExisted();
     //用户名合法
   }
   catch(UserExisedException ue){
     //转发用户已存在页面
   }

在这两种实现方式中,我偏爱第二种,在原来的论坛中也有帖子鼓励使用异常机制而不是使用if--else
甚至有的人说在面向对象的编程中不应该出现if--else,说使用异常机制更应该符合UML中的用例描述(正常事件流,异常事件流)

但是如果使用第二种异常机制的话,那么必须在Service中的每一个方法定义不同的异常对象,
这样action才可以通过捕获不同的异常来返回用户不同的页面.
但是这样会导致自定义异常类变多,如果业务复杂一点,那么自定义异常类会庞大到难以维护.

请问:大家在遇到类似问题是是怎么处理的?
   发表时间:2006-11-19  
异常也是事件的流向,让应用更加清晰。
我比较偏向异常,但是,不要把异常传递太多层,否则开销比if-else大很多。
0 请登录后投票
   发表时间:2006-11-19  

第二种可以针对整个项目统一定义一个应用程序异常AppException ,然后抛出时传不通的自定义异常标识区别不通的异常,这样就不用写那么多重复的异常类了,只要维护这些常量的异常代码就可以了。

 

0 请登录后投票
   发表时间:2006-11-19  
支持第二种方法
异常也可以重构,以避免类爆炸。
if else的格式一定会导致变化修改代码
0 请登录后投票
   发表时间:2006-11-19  
总的说来第一种方法效率要高一些,但程序的流程上不太清晰,后者反之。
原因是抛出异常时要构造异常类,这就增加了系统开销,但在一般的系统里这些开销是极其微小的,所以一般建议用后者,但如果你的异常在代码执行过程中抛出的概率比较高的话建议用第一种方法。

BingJetMa说的很好,我再补充一下,在项目中最好定义一个能用的ApplicationException,自己写一个抽象类MyAction继承Action,在MyAction中处理ApplicationException,项目的所有Action都继承MyAction。
0 请登录后投票
   发表时间:2006-11-19  
http://www.iteye.com/topic/2038
0 请登录后投票
   发表时间:2006-11-21  
这个问题不知道被讨论了多少次了?
很多大师级别的人物也是争论不休
使用第一种方法偏向面向过程多一些
使用第二种方法偏向面向对象多一些
我遇到这种情况的处理原则是:
我的程序能不能处理这个情况?(这儿使用的是情况而不是异常)
如果我能够处理就没有必要去抛出一个异常
只要当我不知道怎么处理的时候才抛出异常,让客户端去处理
就楼主的例子 我会倾向第一种处理方式

0 请登录后投票
   发表时间:2006-11-21  
我认为这是个"仁者见仁,智者见智"的问题,用返回值来标识比较简单、易懂,用异常来处理要写许多异常类复杂、难懂。不过我还是喜欢用简单、易懂的,我想java中的异常处理机制可不是给开发人员用来返回值标识和流程判断的。尤其在web开发中,大量的异常会给已经负担很重的server带来巨大压力,所以应该更多的用if else条件语句来避免可以预想到的异常的产生。在小型的c/s程序中可以考虑使用异常类来处理更多的流程控制。
0 请登录后投票
   发表时间:2006-11-21  
小心和事务冲突。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics