2012-04-02 64 views
6

這可能是一個不錯的問題,但無論如何。可以使用異常進行表單驗證嗎?假設我有一個詢問用戶姓名和電子郵件的表單,是否有權進行以下操作?應該使用異常來進行表單驗證嗎?

try { 
    if (empty($_POST["name"])) { 
     throw new UserRegistrationException("Your name cannot be empty."); 
    } 

    if (filter_var($_POST["email"])) { 
     throw new UserRegistrationException("Invalid email"); 
    } 

    // Save new user into database 
} catch (UserRegistrationException $e) { 
    // Show errors on screen 
} 

而且 - 如果這實際上是在做它 - 正確的方式,如果用戶提交空名稱和無效的電子郵件,將兩個例外的執行或僅首先出現的一個(在這種情況下名字一)?

順便說一句,我使用的是PHP

+0

這絕對是一種使用異常的奇怪方式。 「會執行這兩個例外還是隻執行第一個出現的例外」 - 難以寫出5行代碼並查看自己嗎? – zerkms 2012-04-02 02:24:15

+0

只有第一個會被拋出並被抓住,其他人會被跳過。如果您需要累積錯誤消息,則最好使用普通的舊if/else鏈並將消息附加到數組上。 – 2012-04-02 02:24:39

+0

@Michael我認爲是這樣的......它似乎是一個很好的使用例外(雖然無效的輸入應該被視爲_exceptional_),但我會堅持if/else的 – federicot 2012-04-02 02:28:00

回答

4

我個人喜歡使用異常來阻止或改變程序流。換句話說,如果特定字段的驗證改變了數據的處理方式,或者需要重複該過程,那麼我總是使用異常來處理錯誤。

如果它很微不足道,或者我只是編譯錯誤消息列表,那麼我不會觸發異常。

要回答問題,不能同時拋出兩個異常。第一個拋出的語句將被拋出。這並不是說有時候將其作爲另一種異常重新拋出是沒有意義的。

+0

我想這就是你所說的一個微不足道的情況(並且我還在編譯一個列表的錯誤消息),所以在這種情況下異常不適合 – federicot 2012-04-02 02:49:22

+0

您也可以擴展Exception類來附加一堆構造的異常,然後拋出一個聚合異常(您可以使用它來編譯錯誤消息列表,循環到找到感興趣的特定對象等) – landons 2012-11-16 22:51:57

+0

或者您可以用老式方式(例如追加到數組)來構建驗證錯誤的集合,然後拋出包含所有這些錯誤的單個驗證異常。 – 2013-04-03 02:49:41

4

例外情況用例爲特殊情況。在這種情況下,您是否期望用戶名和密碼字段爲空?如果你正在顯示一個Web表單,我會爭辯說,是的,你確實需要空白的用戶名和密碼字段,所以你應該明確地檢查這個條件,而不是拋出異常。

要回答您的具體問題,如果遇到錯誤,則不會拋出兩個異常。 throw語句將把程序發送到catch塊。從那裏控制將像平常一樣流動。

+5

按照你的定義,每一個例外都是意料之外的。那麼你怎麼知道如何處理它呢?我會爭辯說,在主執行不應該繼續的情況下使用異常。 – landons 2012-11-16 22:53:40

+0

更不用說人們可以簡單地將驗證錯誤添加到數組中,然後將其分解爲一個字符串,然後將其作爲異常拋出 – Alex 2017-04-01 06:58:46