2012-06-22 73 views
7

我有一個包含項目集合的類。爲方便起見,我提供GetCurrentItem這是由創建可能拋出的屬性IndexOutOfRangeException

public Type GetCurrentItem 
{ 
    get { return this.items[this.items.Count - 1]; } 
} 

如果在列表中沒有的項目,這將拋出一個異常實現。

我應該拋出異常還是應該返回null?如果這是我交給你的API,你會期望什麼?異常或null?有沒有更好的方法來處理這個問題?

+2

這是正確的API:'Enumerable.Single'或'Enumerable.SingleOrDefault'? (回答:它取決於) –

回答

9

至於哪一個更正確?正如柯克的評論所暗示的那樣:這取決於。有時候null是合乎邏輯的,如果沒有默認值是合理的,有時例外更適合。我試圖做的一件事就是想到「是否呼叫GetCurrentItem邏輯失敗或安全的事情?」

如果在沒有任何東西的情況下調用GetCurrentItem失敗,則拋出異常是正確的過程。例如,如果您的收藏有HasCurrentIsEmpty屬性,在致電GetCurrentItem之前某人可以檢查結果,那麼他們應該「知道得更清楚」。但是如果當前的項目是null是使用你的課程的正確邏輯方式,那麼通過一切手段來設計它。無論哪種方式,我都會在代碼註釋中記錄行爲,讓用戶知道預期的行爲。

雖然我會這樣說,但暴露了ArgumentOutOfRange異常可能是出血執行的細節。也就是說,如果這個類的用戶不知道內部結構是一個數組還是List<T>,那麼不要流出這個異常,而是抓住它,包裝它,然後拋出一個更有意義的(自定義或類似的東西InvalidOperationException)。

因爲他們沒有真正直接傳遞一個說法,他們得到一個ArgumentOutOfRange的例外可能是混亂:-)

+0

異常的一個好選擇是'InvalidOperationException',遵循'Stack .Peek()'設置的示例。 –

+0

@MichaelLiu:是的,同意。我在編輯時加入了,就像你評論過的那樣:-) –

3

讓它拋出一個錯誤。這就是其他收藏的工作原理。應該由用戶應用程序來處理潛在的異常(特別是在處理集合時)。在繼續之前,用戶可以調用bool HasSelection()方法。

3

例外情況應該用於例外情況。如果CurrentItem可以爲null,則不應拋出異常。我不明白爲什麼沒有一個CurrentItem是例外。

1

然後,問題是你是否希望GetCurrentItem返回一個安全值。如果Type是可空的,那麼當沒有當前項目時,GetCurrentItem可能應該返回null。如果你總是期望列表是非空的,並且總是有默認選擇的東西,那麼拋出一個有意義的異常。

你通常不應該拋出一個異常,除非你的情況確實是一個異常,而不是一個正常的用例。但是,這可能是相當主觀的。

0

如果GetCurrentItem讓你的API的意義時,有沒有項目我會拋出「InvalidOperationException異常」。如果允許null作爲有效結果,您可能想要以不同的方式命名它。

考慮現有的LINQ Last方法是否已經提供了相同的功能。

1

我試圖從用戶的角度思考它。去Principal of Least Astonishment

如果我用的是庫或對象,並呼籲GetCurrentItemIndexOutOfRangeException被拋出,我會想,「我沒有與索引叫什麼,我想當前的項目。」因此,我的建議是返回null,這會讓我想,「哦,沒有當前項目。」

或者,如果這個屬性是一個索引器,我想要得到一個特定索引的項目,我不會感到驚訝的是一個IndexOutOfRangeException

相關問題