2013-02-20 36 views
5

用於方括號的C#引用表示:方括號[]用於數組,索引器和屬性。它們也可以用於指針。 (它也表示,對於數組)如果數組索引超出範圍,則會引發異常。如何確定「x []」可能拋出哪些異常?

所以,當你在數組以外使用方括號時,你怎麼知道可能會拋出什麼異常呢?

對於字典,如果你使用的訪問方法,如Dictionary.TryGetValue您可以輕鬆地查找,該方法可能會拋出異常(例如),但C# reference for square brackets []只是說,它可能會拋出異常的指數超出範圍的數組。

所以,如果你想用方括號的一些數據類型,在哪裏可以查找哪些異常可能拋出該數據類型?

我試着訪問一個不存在的字典成員,只是爲了看看會發生什麼,並且我得到了KeyNotFoundException。我知道你也可以得到NullReferenceException。這在哪裏記錄?什麼是完整列表?

+1

你爲什麼需要一個列表?一個普通的'catch(Exception ex)'不起作用嗎? – DiskJunky 2013-02-20 22:44:06

+1

@DiskJunky,捕捉泛型異常是一種最糟糕的做法(除非在最高級別時可能會記錄它並仍然彈出)。 – 2013-02-20 22:45:08

+0

@pst同意,因爲它可以超載,你可以實現你自己的索引實現,並拋出你喜歡的任何地獄:) – RobJohnson 2013-02-20 22:45:23

回答

4

每個實現都記錄在案。沒有詳盡的列表,因爲運營商可能會超載,所以可能會引發任何異常。操作員通常記錄爲Item屬性。

下面是具體的用途一些文檔:

Dictionary.Item

Array.Item

然而,你不應該需要一個詳盡的清單上有什麼可能被拋出。異常通常抓到兩個原因:要麼你想(捕獲異常是搭上了錯誤的日期格式,最簡單的方法時,像天TryParse前)做一些事情,或者你只是想說明一個異常發生並記錄下來,在這種情況下,您通常會重新審查實際的異常。

捕獲特定的異常對前一種情況是有益的。例如,如果你趕上NullReferenceException它通常重新拋出不同的異常,說明引用爲null(因爲這不是股票NullReferenceException)的一部分。

在後一種情況下,接住一個通用Exception是罰款如果你只是想記錄和再擲因爲有可能沒有別的當[] Operator應用於詞典< TKEY的,TValue >或列表<牛逼>你可以做些什麼。

+0

謝謝 - 我實際上並不想知道爲了瞭解所有內容而會拋出什麼*。我只是想知道什麼是有效的,所以我可以想象我是否想要處理它。案例和觀點:在我的問題中,我說Dictionary可能會拋出NullReferenceException,但事實證明,當您查看Item屬性時,它實際上可能會拋出ArgumentNullException。因此,如果我編寫代碼來捕獲NullReferenceException,我想我正在覆蓋我的軌道,但我實際上是在愚蠢地編寫垃圾代碼。 – 2013-02-21 03:01:36

+0

@EdwardNedHarvey - 好吧,「垃圾」很強。如果你只是捕獲'NullReferenceException'並且拋出一個'ArgumentNullException',那麼所有將發生的異常都會被你的代碼或者框架代碼捕獲到更高的堆棧。 – 2013-02-21 13:37:12

+0

@D斯坦利的觀點是,在沒有查找可能拋出的實際異常的情況下,我傾向於編寫代碼,認爲我正在捕捉一個我沒有捕捉到的異常。然後當我調試它時,我會看到它拋出了「Null」異常,但它沒有捕獲到「Null」異常,但是代碼說要捕獲「Null」,直到我繞着圓圈旋轉,最後發現有多餘一種不同類型的「空」異常。是的,那將是垃圾代碼。比垃圾糟糕。我很高興現在能夠回答這個問題,所以我不會犯這個錯誤,而且我可以搜索我已經做到的地方。 – 2013-02-21 21:06:33

1

一般來說,方括號基本上讓你訪問一個索引屬性 - 所以無論錯誤發生在您使用對象的屬性索引提及。

對於數組,它可能是索引超出範圍,對於DataRow,可能是列未找到等等。

4

,它調用該實例的indexer。索引器是一個特殊的屬性,帶有參數並且是通常稱爲Item

1

當用於訪問數組,它可以拋出一個IndexOutOfRangeException

當用於某個屬性時,它不能拋出任何異常,因爲在編譯時會出現任何錯誤。

當用於訪問索引器時,它可以拋出任何異常。索引器可以以任何你想要的方式實現,並拋出任何它喜歡的異常。