2011-06-10 20 views
4

的缺點是什麼如下的優點和實現自定義異常的缺點:
創建它代表了其描述錯誤消息的枚舉:優點和實施一個通用的自定義異常

public class Enums 
{ 
    public enum Errors 
    { 
     [Description("This is a test exception")] 
     TestError, 
     ... 
    } 
} 

創建一個自定義異常類:

public class CustomException : ApplicationException 
{ 
    protected Enums.Errors _customError; 
    public CustomException(Enums.Errors customError) 
    { 
     this._customError = customError; 
    } 
    public override string Message 
    { 
     get 
     { 
      return this._customError!= Enums.Errors.Base ? this.customError.GetDescription() : base.Message; 
     } 
    } 
} 

GetDescription方法是一個枚舉擴展方法使用反射它獲取枚舉描述。這樣一來,我可以拋出異常,如:

throw new customException(enums.Errors.TestError); 

並顯示給用戶像catch塊:

Console.WriteLn(ex.Message); 

我已經看到了這個辦法通過一個MVP建議。這種方法在以下方面有什麼好處:

  • 使用泛型異常:throw new Exception(「Error Message」);.
  • 使用自定義例外:爲任何情況定義自定義例外。例如(WebServiceException類,AuthenticationException類等)

Here's the link由MVP的建議。

謝謝。

+2

焦點附近投票? WTF?也許可以這樣說,這個問題是主觀的,有爭議的,並且更好地屬於程序員.stackexchange.com ......但我不確定這一點。 – 2011-06-10 17:58:05

+0

題外話?謹慎分享原因? – Kamyar 2011-06-10 18:00:14

+0

您的示例顯示了「通用」和「自定義」之間的矛盾。 @alexn解釋了後果。 – 2011-06-10 19:35:07

回答

5

個人而言,我不認爲這是一個好主意。

你應該總是拋出儘可能特殊的例外。捕捉也是一樣。

很容易確定我們是否想要捕獲WebServiceExceptionAuthenticationException,但是對於您的Enum示例,我們必須解析字符串以決定是否要捕獲它。如果此消息更改會發生什麼?

我不認爲它有任何好處。對於每種錯誤類型,您必須創建一個新的Enum成員。爲什麼不創建一個新的類呢?

+0

感謝您的回覆。如果我們想改變消息,我們只需要改變枚舉描述。所以這不是問題。但我同意,使用明確定義的異常似乎更合理。然而,由於這是MVP(http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/8090d55e-fb74-46a3-8a94-916b4dc7658a)的最後一篇文章推薦的,我以爲我應該加倍檢查。 – Kamyar 2011-06-10 17:59:23

+1

@Kamyar是的,但是如果你拋出新的CustomException(Enum.First)''但你只想捕獲'CustomException(Enum.Two)'?在你的情況下,你必須解析Message屬性。如果將實際的Enum類型作爲屬性公開,那會更好。但是,在決定是否可以處理之前,您仍然需要抓住它。 – alexn 2011-06-10 18:05:15

+0

你說得對。感謝澄清。 – Kamyar 2011-06-10 18:10:15

2

選項1我不會推薦。你根本不應該投擲System.Exception。您應該始終拋出最適合您情況的特定異常,以便在代碼中進行結構合理的異常處理。

我在您提出的方法(Errors enum)中看到的一個主要缺點是,您無法決定是否要在不捕獲異常的情況下處理異常。使用自定義例外,您可以事先做出決定。

3

自定義異常的主要優勢在於區分不同異常類型的語言支持。例如

try 
{ 
    SomeFunc() 
} 
catch(CustomException EX) 
{ 
    //This is my error that I know how to fix 
    FixThis() 
    DoSomeAwesomeStuff() 
} 
catch(Exception exa) 
{ 
    //Somthing else is wrong 
    WeepLikeBaby(); 
} 

如果我使用的短信房產

try 
{ 
    SomeFunc() 
} 
catch(Exception exa) 
{ 
    if(exa.Message == "ErrType 1") 
    { 
     DoStuff; 
    } 
    if(exa.Message == "ErrType 2") 
    { 
     Die(); 
    } 
} 

利用基本枚舉例子仍然可以保留這種能力。然而,你給自己一個地方來定義你的消息,但是這可以通過應用程序以各種不同的方式解決。枚舉示例將使創建本地化消息變得非常簡單,因爲它會爲您提供一種獨立定義消息字符串的方法。

另一個優點是您可以添加Cusotm數據,在您的應用程序中有意義。比如說你有一個客戶信息系統,客戶ID幾乎總是很重要。如果僅使用消息屬性,則每個處理程序必須知道如果需要解析出該信息。

public class MyCustomeEx : Exception 
{ 
    int CustID { get; set; } 
} 

public void Fail() 
{ 
    //Awww Customer error 
    throw new MyCustomeEx() {CustID = 123} 
} 
+0

謝謝。非常豐富。 – Kamyar 2011-06-10 18:10:34

2

對MVP推薦的link進行了評論。

在看了代碼和問題後,我認爲這是爲了限制異常中的可能消息。也許可以幫助本地化異常文本,但是在這個例子中還有額外的工作要做。無論如何,這種方法不應該用於創建處理不同的「異常子類型」。