2009-10-15 98 views
10

任何人都可以闡明拋出自定義異常(從System.Exception繼承)的優點和缺點,或正確的方式來使用它們嗎?我已經知道何時/何時不拋出異常,但我正在尋找如何創建自己的自定義異常的指導。.NET拋出自定義異常

+1

杜佩:http://stackoverflow.com/questions/417428/why-create-custom-exceptions – 2009-10-15 15:34:45

+0

我不會把這看作是一個愚蠢的事情,關閉,但不在我的書中,也許我的問題不夠清楚。 – andrewWinn 2009-10-15 15:37:11

+0

這當然是一個比鏈接副本更好的措辭。如果關閉,我將投票重新開放。 – Randolpho 2009-10-15 15:45:55

回答

9

這些都是很棒的貼子。到目前爲止,我最同意Brian Rasmussen - 當你想處理不同類型的特定異常時創建自定義異常。

也許一個例子會有所幫助。這是一個人爲的例子,在日常代碼中可能有用或不用。假設你有一個負責認證用戶的類。除了對用戶進行身份驗證之外,該課程還有一個鎖定機制,可在幾次失敗嘗試後鎖定用戶。在這種情況下,您可以將其設計爲類別2自定義例外的一部分:AuthenticationFailedExceptionUserLockedOutException。如果用戶被成功認證,您的AuthenticateUser方法就會簡單地返回而不拋出,如果用戶未通過身份驗證,則拋出AuthenticationFailedException,如果用戶被鎖定,則拋出UserLockedOutException

例如:

try 
{ 
    myAuthProvider.AuthenticateUser(username, password); 
    ShowAuthSuccessScreen(); 
} 
catch(AuthenticationFailedException e) 
{ 
    LogError(e); 
    ShowAuthFailedScreen(); 
} 
catch(UserLockedOutException e) 
{ 
    LogError(e); 
    ShowUserLockedOutScreen(); 
} 
catch(Exception e) 
{ 
    LogError(e); 
    ShowGeneralErrorScreen(); 
} 

再次,一個人爲的例子。但希望它可以顯示如何以及爲什麼要創建自定義例外。在這種情況下,AuthProvider類的用戶正在以不同的方式處理每個自定義異常。如果AuthenticateUser方法簡單地拋出了Exception,那麼將不可能區分不同的原因爲什麼拋出了異常。

+1

很好的解釋,用例子得到我的接受票。 – andrewWinn 2009-10-15 16:23:08

1

自定義異常允許您提供清晰,有意義的異常,這反過來可以使您的庫更加可用,前提是您在適當的時候使用現有異常。

無論何時您需要引發不適合直接放入框架異常模型的異常,您都可以創建自定義異常。

4

使用您自己的例外來標記特定於您的應用程序/域的錯誤。優點是你的catch塊可以過濾正確的異常並根據這些異常行事。對於其他所有使用特定的標準例外。