討論:一個類的方法應該使用返回值來標識執行狀態,還是拋出異常?

討論:一個類的方法應該使用返回值來標識執行狀態,還是拋出異常?

在一般的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纔可以通過捕獲不同的異常來返回用戶不同的頁面.
但是這樣會導致自定義異常類變多,如果業務複雜一點,那麼自定義異常類會龐大到難以維護. 

@`````總的說來第一種方法效率要高一些,但程序的流程上不太清晰,後者反之。
原因是拋出異常時要構造異常類,這就增加了系統開銷,但在一般的系統裏這些開銷是極其微小的,所以一般建議用後者,但如果你的異常在代碼執行過程中拋出的概率比較高的話建議用第一種方法。

BingJetMa說的很好,我再補充一下,在項目中最好定義一個能用的ApplicationException,自己寫一個抽象類MyAction繼承Action,在MyAction中處理ApplicationException,項目的所有Action都繼承MyAction。

@`````我認爲這是個"仁者見仁,智者見智"的問題,用返回值來標識比較簡單、易懂,用異常來處理要寫許多異常類複雜、難懂。不過我還是喜歡用簡單、易懂的,我想java中的異常處理機制可不是給開發人員用來返回值標識和流程判斷的。尤其在web開發中,大量的異常會給已經負擔很重的server帶來巨大壓力,所以應該更多的用if else條件語句來避免可以預想到的異常的產生。在小型的c/s程序中可以考慮使用異常類來處理更多的流程控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章