2012-11-27 33 views
5

在msdn link中提到
不要拋出System.Exception或System.SystemException。
在我的代碼我舉辦這樣捕捉並拋出異常的最佳做法

private MsgShortCode GetshortMsgCode(string str) 
     { 
      switch (str.Replace(" ","").ToUpper()) 
      { 
       case "QNXC00": 
        return MsgShortCode.QNXC00; 
       default: 
        throw new Exception("Invalid message code received"); 
      } 
     } 

這是一個不好的做法?

回答

9

通常你可以更明確。

在這種情況下,你可以拋出一個

ArgumentException 

你越具體,越容易對其他代碼來處理異常。

這允許你做

try 
{ 
    GetshortMsgCode("arg") 
} 
catch(ArgumentException e) 
{ 
    //something specific to handle bad args, while ignoring other exceptions 
} 
3

在您應該投擲ArgumentException這個特定的實例。

特定異常類型的要點是從調用者的角度考慮它。我知道當你也在編寫調用代碼時,這實際上是非常棘手的,因爲你瞭解雙方的實現細節。但是,請務必考慮如何向主叫方提供足夠的信息以清楚地瞭解他們做錯了什麼。

在這種情況下簡單地拋出Exception將意味着他們將不得不解析錯誤信息,瞭解他們做錯了什麼,而投擲ArgumentException意味着他們可以在他們之間有try/catch語句更容易區分已經通過你的東西無效或你有由於某些其他原因未能正確執行。

1

我不願意使用「不好的做法」這樣的詞語,因爲在某些情況下幾乎所有東西都是正確的。但通常情況下,最好是拋出存在於你的情況中的最特殊的異常,如果某個特定的異常不存在,你應該定義一個異常。

原因是,如果你拋出Exception,你的調用者不能區分你正在引發的錯誤和系統在你的代碼調用期間可能拋出的任何其他異常。

在很多情況下,調用者可能會決定處理您的異常而不是其他問題,或者至少他們可能會在發生異常時記錄特定的消息。如果您的例外情況不容易與其他人區分,則調用方很難實現這一點。