2011-04-16 69 views
134

爲了拋出異常,我通常使用內置的異常類,例如ArgumentNullExceptionNotSupportedException。但是,有時我需要使用自定義例外,並在這種情況下我寫:什麼是ApplicationException在.NET中?

class SlippedOnABananaException : Exception { } 
class ChokedOnAnAppleException : Exception { } 

等等。然後我在代碼中拋出並捕獲它們。但是今天我碰到了ApplicationException課 - 我應該使用它嗎?這是爲了什麼?

有很多有效的相同的異常類與不同的名稱(我通常不需要任何單獨的功能)似乎效率低下。但我不喜歡捕捉一個通用的ApplicationException,並不得不使用額外的代碼來確定錯誤是什麼。

ApplicationException哪裏應該符合我的代碼?

+21

偉大的問題,也是巧妙命名的示例異常的+1 – 2011-04-16 10:43:14

+0

相關:http://stackoverflow.com/questions/16603065/applicationexception-or-create-custom-exceptions。 – 2014-07-24 17:26:50

+0

@CodyGray你爲什麼認爲這些異常名稱很聰明?我的意思是我們應該如何命名一個例外? :) – Beatles1692 2015-04-29 10:12:31

回答

82

根據MSDN中的remarks

用戶應用程序,而不是公共語言運行時,拋出從ApplicationException的類派生自定義異常。 ApplicationException類區分應用程序定義的異常和系統定義的異常。

如果您正在設計需要創建自己異常的應用程序,建議您從Exception類派生自定義異常。最初認爲自定義異常應該來自ApplicationException類;然而在實踐中,這並沒有被發現增加顯着價值。有關更多信息,請參閱處理異常的最佳實踐。

Exception導出它們。另外,只要有擔保,我認爲您的案件不會出現新的例外情況。如果遇到框架中已經存在異常的情況,請使用該框架,否則請自行推出。

+6

所以看起來'ApplicationException'是無用的,僅僅是因爲向後兼容性? – Beatles1692 2015-04-29 10:10:24

16

在最初的設計中,在.NET 1.0中,計劃框架本身將拋出SystemException並派生出來;而用戶應用程序 - 將拋出ApplicationException並派生。

但是後來,在.NET 2.0中,這種情況被拋棄了。因此得自Exception

110

簡短的回答是:無處。

這是過去的遺蹟,微軟希望開發人員從ApplicationException繼承所有自定義異常。不久之後,他們改變了主意,並建議自定義異常應該從基類Exception類派生。請參閱MSDN上的Best Practices for Handling Exceptions

一個這樣做的更加廣爲流傳的原因來自於從傑弗裏裏氏的exerpt在Framework Design Guidelines

System.ApplicationException是,不應該是.NET Framework的一部分的類。最初的想法是,從SystemException派生的類將指示從CLR(或系統)本身拋出的異常,而非CLR異常將從ApplicationException派生。但是,很多異常類並沒有遵循這種模式。例如,TargetInvocationException(由CLR拋出)源自ApplicationException。所以,類丟失了全部含義。從這個基類派生出來的原因是允許調用堆棧中的某些代碼更高地捕獲基類。不可能再捕捉所有的應用程序異常。

所以你有它。執行摘要是ApplicationException不是有害,只是沒用

+2

有誰知道*爲什麼*是?這似乎是有道理的,這樣你可以顯示應用程序例外,但不會「程序員搞砸」例外。 – 2012-07-09 21:13:31

+1

答覆已更新,以迴應@JoshKodroff。 – 2012-07-10 12:16:21

+7

順便說一句,從這個解釋看來,這本身並不是一個糟糕的設計,但是MSFT搞砸了這個實現。其他人是否也有類似的閱讀? – 2012-07-10 16:26:52