2012-02-16 20 views
2

我正在開發一個java web應用程序,我有幾個關於設計的問題。設計問題:我應該在多大程度上依賴於控制流程的例外情況?

基本上在其當前版本中,它在很大程度上依賴捕捉異常來確定控制流程

例如在我的一個spring服務類中,我有以下方法來檢查作爲參數給出的電子郵件是否存在於數據庫中。

@Override 
public boolean validateEmailAddressDoesNotExist(String accountEmailAddress) { 
    try { 
     return !dao.checkIfEmailAddressAlreadyExists(accountEmailAddress); 
    } catch (NoResultException re) { 
     log.error("NoResultException", re); 
    } catch (RuntimeException re) { 
     log.error("RuntimeException", re); 
    } 
    return true; 
} 

//from "dao" class 
public boolean checkIfEmailAddressAlreadyExists(String accountEmailAddress) { 
    return (loadAccountFromAccountEmailAddress(accountEmailAddress) == null ? false : true); 
} 

//also from "dao" class 
public Account loadAccountFromAccountEmailAddress(String accountEmailAddress) { 
    return entityManager.createNamedQuery("Account.findByEmailAddress", Account.class).setParameter("accountEmailAddress", accountEmailAddress).getSingleResult(); 
} 

我懷疑我目前的設計可能是錯誤的,但我將不勝感激閱讀您的意見和看法一下和你相信它在多大程度上是有缺陷的。

+1

這可能更適合http://codereview.stackexchange.com/ – 2012-02-16 15:51:33

+0

@All:非常感謝您的答覆! – balteo 2012-02-17 20:53:19

+0

@ Rich.Okelly:不知道這個網站。這似乎也很有趣。下次我有這個問題時,我會用這個... – balteo 2012-02-17 20:54:07

回答

3

服務模型中的驗證方法不應該捕捉異常。這是不好的原因如下:

  • 這不是一個特殊的條件。 「沒有結果」是常見的情況。

  • 間接地耦合您的驗證到框架的數據檢索方法的實現。要了解爲什麼這樣做不好,請想象一下,如果您的框架發生變化,它現在會產生EmptyResultSetException。你必須更新所有的驗證方法。哎呀!

你一定不能幫助它,如果你的基本框架提出了異常,表示「沒有結果」,但你肯定可以控制checkIfEmailAddressAlreadyExists一樣。

改變這種方法,使其如果地址存在,則返回true,並false如果沒有,或者如果沒有發現結果。

3

我更喜歡從checkIfEmailAddressAlreadyExists等方法返回一個布爾值,並根據返回值簡單地控制流,併爲真正的例外情況保留Exceptions,例如不能連接到數據庫。

4

一般的經驗法則是例外是針對「特殊」條件。

因此,如果一個數據項可能在那裏,或者可能合理缺席,那麼返回一個布爾值將更加正常。它通常還會產生更簡單,更清晰的代碼。

然後可以保存爲真正的特殊情況例外,如網絡故障等

在某些情況下,第三方庫可能不會給你任何的選擇 - 如果他們拋出異常,那麼你必須處理他們!

1

我不是一個Java程序員,實際上從來沒有使用過它。

但是我知道在C#世界中提升和捕捉異常是非常昂貴的。所以,控制他們的流量是非常低效的,而不是自己檢查一些事情,並且爲你沒有想到的事情留下異常,如DNA所說。

相關問題