2011-07-17 82 views
0

我正在驗證實用程序方法中Restlet URL的某些輸入(這樣,如果我採取的行爲發生變化,我只能將其更改爲一個地方,yay)。 legalName本質上驗證該值爲alphaNumeric,但我可能會很快允許其他角色。哪個例外最適合在這裏?

我儘量讓我的例外有意義 - 在這種情況下什麼異常會是最好的?

public static String getProperty(Request request, String key) { 
    String value = request.getAttributes().get(key).toString(); 
    // unless something is specifically text, it is a property 
    if(legalName(value)) return value; 
    throw new IllegalArgumentException(value); 

} 

我的想法是:

  • 拋出:IllegalArgumentException - 的關鍵,直接導致了無效的結果
  • IllegalStateException異常 - 我們正在嘗試使用不符合要求的值
  • 也不例外 - 回報一個空字符串並記錄違規行爲發生的事實
  • 沒有例外 - 刪除任何不需要的字符,返回消毒後的字符串並記錄事實

當然我不是第一人,要驗證:-)

回答

2

當屬性存儲時,應該拋出像這樣的異常,而不是檢索。檢查Restlet validation

如果你更喜歡堅持自己的解決方案:

  • 的方法重命名爲validateName(..),讓它拋出異常。如果沒有 - 返回值。
  • javax.validation.ValidationException看起來更好的選擇,但你可以使用你提到的兩個IllegalXException中的任何一個。只要確保他們有更詳細的信息。
+0

通常情況下,它不會被存儲,它只是用作參數。它可能仍然會以查詢結束。我的想法是,如果我一進入系統就對其進行清理,我知道我會有安全的投入。 – corsiKa

+0

看到我的更新btw – Bozho

+0

哦,我很喜歡第一個子彈選項。這也更好,因爲使用驗證的其他任何事情都不必執行拋出,也就是說,如果它發生更改(如下所述並使用驗證框架),它就在我更改它的地方,而不是一打。至於存儲驗證,我明白你的意思。在它甚至到達我的代碼之前基本上攔截它。我肯定會研究這一點。謝謝! – corsiKa

1

這似乎是無效的用戶輸入,所以首先我會去一個ValidationException某種並使用之前輸入驗證框架,而不是自己管理它。如果不是ValidationException,那麼IllegalArgumentException可能會使您列出的選擇最有意義。

+0

驗證框架?我想我沒有完全意識到他們,但我想有一個框架的一切。你能推薦一個非常輕量級的驗證框架嗎? – corsiKa

+1

Spring的數據綁定和驗證框架非常好。您不必使用Spring的其餘部分從中受益。 – duffymo

+0

謝謝duffy,我會研究一下。 – corsiKa

0

您可以使用自定義(您自己)的異常類。根據情況或驗證,您可以使用適當的消息將其拋出。 For Ex:1.For非法參數異常情況在try catch和catch中處理該代碼塊並拋出自己的異常並帶有適當的消息。

+0

我可以製作自己的Exception類,但我更喜歡在做標準事情時使用標準類。 (Effective Java 2nd ed Item 60:贊成使用標準異常。)我還沒有添加消息,儘管無論我最終使用它的異常都會有適當的消息:-) – corsiKa