2010-01-25 69 views
7

FormatException是不是繼承自ArgumentException?一個無效的格式似乎是一個非常具體的無效論據,類似於ArgumentOutOfRangeException爲什麼FormatException不會從ArgumentException繼承?

MSDN article for the class狀態:

出現FormatException當在一個方法調用的參數的格式不匹配對應的形參類型的格式被拋出。例如,如果一個方法指定一個String參數,該參數由包含句點的兩位數字組成,則將包含兩位數的相應字符串參數傳遞給該方法會導致引發FormatException

聽起來就像是ArgumentException或派生類的情景。

所有這一切都意味着,你不能FormatException處理較大ArgumentException例外族下,也不能確定哪個參數導致引發異常。

沒有任何理由爲這個看似外的地方是例外,它在哪裏?

回答

13

FormatException時的方法的正式說法是無效不一定拋出。如果該方法使用外部資源並且來自外部資源的數據格式不合適,也會發生這種情況。

例如,如果要從流中讀取的內容不是有效的7位編碼整數,則BinaryReader.Read7BitEncodedInt將拋出FormatException。它根本沒有任何爭論。另一方面,只有當作爲形式參數傳遞給方法的參數無效時才應該拋出該異常。

您從MSDN文章中引用的說明比FormatException更具限制性,應該澄清。

+0

對我來說,這是一個令人信服的論據。圍繞該類的文檔在使用異常時專門提到了參數時很容易引起誤解。 – 2010-01-25 20:31:45

+0

Downvoter:謹慎解釋?我很想知道這個答案中的內容真的是「可以降低的」。 – 2010-01-25 20:34:21

+0

這是我的錯誤點擊,當時不會讓我撤消。如果你編輯你的答案,我很樂意將其撤銷。 – 2010-01-25 20:41:14

5

這是有點流鼻涕:但裏希特CLR通過C#(頁432)表明,也許是因爲異常類層次結構並沒有在.NET中實現的非常好:

微軟的最初的想法是這System.Exception將是所有異常和其他兩個類型,System.SystemExceptionSystem.ApplicationException將立即從Exception得到的只有兩種基本類型。此外,CLR引發的異常將從SystemException派生,所有應用程序拋出的異常將從ApplicationException派生。這樣,開發人員可以編寫一個捕獲所有應用程序拋出的異常的catch塊。

但是......這條規則並沒有很好地遵循;有些例外是從ExceptionIsolatedStorageException)立即得出的,一些CLR拋出的異常是從ApplicationException派生的...所以這一切都是一團糟,其結果是SystemExceptionApplicationException類型根本沒有什麼特殊含義。此時,Microsoft想要將它們從異常類層次結構中移除,但它們不能,因爲它會破壞已引用這些類型的任何代碼。

這是不完全解答您的查詢,但我認爲這是相關的,因爲我認爲這表明,確實沒有一個很好的理由,爲什麼有些例外衍生繼承他們的方式。不幸的是,Exception類的繼承並不是所有這些都深思熟慮的&這是一個混亂。