2014-02-07 65 views
2

當給定的參數無效時接受多個參數的方法應引發哪個異常當一起給出時無效的參數對異常

作爲一個例子,考慮

public Bar DoSomething(Foo f1, Foo f2) 
{ 
    //implementation... 
} 

其中完成操作是在f1f2之間的一些關係或相似隊伍(如果陣列/集合,它們必須具有相同的大小;如果運動員,它們必須是在同一支球隊/對手隊伍中;等等)。

每個參數都是該操作的有效參數,但它們在一起無效。例如:

public MatchResult PlayMatch(Player a, Player b) 
{ 
    if(a.Team == b.Team) 
    { 
    //Throw exception here, since players must be on different teams 
    } 

    //Play match, determine winner 
} 

拋出ArgumentException似乎不正確的,因爲它意味着,其中一個參數是無效的,而不是所述雙參數一起是無效的。

+0

可以'MatchResult'不住指示對象是無效的值? – 48klocs

+0

爲什麼ArgumentException無效? 「b.Team」的論據不應該等於「a.Team」;這就是爲什麼「b」是一個無效的論點。 –

回答

2

您不必須引發異常。在我看來,這甚至不應該拋出異常,因爲它是匹配邏輯的深層部分。我會讓匹配失敗(返回零或任何你所做的),並在文檔中提到這個事實 - 比如「比較來自不同團隊的兩名球員」。這意味着比較來自同一隊的球員將導致失敗。

+1

在這裏同意。這不是一個例外規則,而是一個邏輯規則。從不使用異常來流動您的應用程序邏輯。總是儘可能早地確定您的輸入,並在那裏顯示錯誤,然後儘可能。 –

+0

應設計方法和返回值,以便在調用者不準備處理它們時問題條件只應導致異常。如果一個調用者不能處理一個條件,那麼在該方法中拋出該條件將避免需要用代碼來調用它來測試它。除了代碼重複之外,try/do模式會很好;我希望有一個非冗餘try/do模式的標準約定。 – supercat

+0

@Ahmedilyas然而,它有助於在開發早期追蹤邏輯或錯誤中的缺陷。 –

1

的ArgumentException將使意義在這裏,因爲有一些錯誤,在傳遞的參數,您可以隨時添加郵件到您的throw語句:

throw new ArgumentException("Players can't be on the same team!"); 

它可能不是一個好主意,拋出一個異常這裏如果用戶做錯了什麼。我個人認爲異常應該實際上捕捉用戶無法控制的情況(比如文件讀取失敗的中途),這樣你可以優雅地使程序失敗。你能做的就是隻顯示某種錯誤消息,返回null,並強制用戶再次挑選團隊:

public MatchResult PlayMatch(Player a, Player b) 
{ 
    if(a.Team == b.Team) 
    { 
     MessageBox.Show("Players must be on different teams!"); 
     return null; 
    } 

    //Play match, determine winner 
}