2012-04-11 32 views
1

我發送httpRequest並在try塊中獲取httpResponse。現在我真的不在乎因爲什麼原因得到什麼類型的異常。如何親切地解決fxCop警告「捕獲特定異常比類型System.Exception」?

try 
    { 
     var request = WebRequest.Create(new Uri("MyUrl")) as HttpWebRequest; 
     request.GetResponse(); 
    } 
catch(Exception) 
    { 
    } 

的FxCop要我給出具體的例外,這樣在我來說,我需要創建多個catch塊如下:

NotSupportedException 
ArgumentNullException 
SecurityException 
InvalidOperationException 
ProtocolViolationException 
NotSupportedException 
WebException 

我怎樣才能解決這個警告,避免寫在這些衆多的catch塊同時?

+3

「現在我真的不在乎因爲什麼原因我會得到什麼類型的異常。」這些原因是什麼?抓住'Exception'幾乎總是做錯事情(記住,異常處理程序也運行於你不期望的異常 - 'OutOfMemoryException','ThreadAbortException',類似的事情),所以也許如果你能解釋爲什麼你抓住它,有一個更好的選擇。 – hvd 2012-04-11 21:13:58

回答

1

FxCop的警告是建議,不是任務。

換句話說,您可以自由地使用您的判斷來判斷是否遵循fxCop制定的指導方針和建議。

這個特別的建議在那裏,因爲你可能想要以不同的方式處理不同類型的錯誤。如果情況並非如此,您可以ignore this rule,這樣不會混亂您的警告列表。

您比fxCop更瞭解您的業務規則和編碼標準。它只是根據可能適用或不適用於您特定情況的最佳實踐提出建議。

更多信息可以在這裏找到:http://msdn.microsoft.com/en-us/library/bb429303(VS.80).aspx

+0

嗯。有道理.. FxCop是比我想象的Dumber ..:D +2.0 – om471987 2012-04-11 21:18:39

+2

我不會說它愚蠢。它恰好無法閱讀你的想法,只能通過統計。對於大多數人來說,有一個非全部的異常處理塊是有意義的。 – Cornelius 2012-10-09 08:51:17

-1

嘗試讓它空

try 
{ 
     var request = WebRequest.Create(new Uri("http://localhost:59449/stwebapi/getstatus?userId=" + wwId)) as HttpWebRequest; 
     request.GetResponse(); 
    } 
catch 
{ 

} 

需要說的,這是非常糟糕的設計thow,所以它能夠更好地遵循FxCop指引,或至少處理異常,並將其記錄(至少)

+0

謝謝Tigran。但在這種情況下,它緩存更通用的錯誤,這是System.Object – om471987 2012-04-11 20:59:48

+1

你*認真*建議OP採用空catch子句的模式!? – 2012-04-11 21:00:09

+0

@KirkWoll:我很有耐心地寫出這是一個糟糕的設計,不遵循這一點。馬回答是問題。 – Tigran 2012-04-11 21:00:57

2

您可以關閉幾個警告,我總是停用此警告:-)

+0

感謝菲利普..這些不是編譯時警告,但運行時異常.. – om471987 2012-04-11 21:03:56

+0

我不明白。 FxCop正在分析你的代碼,而不是編譯或運行它。 – Philipp 2012-04-11 21:07:35

+0

哦..我的壞..沒關係 – om471987 2012-04-11 21:10:19

4

another question這是問關於這個話題,如果你想趕上例外,你必須有處理程序中的最後throw爲了防止警告出現類似。

MSDN documentation此警告:

要修復與該規則的衝突,趕上一個更具體的例外,或 重新拋出的一般例外,因爲在catch 塊中的最後一條語句。

這就是說,這不會真的有助於你的情況,因爲你想「吞下」異常,而不是重新拋出它。看看這六個特定例外情況的列表,我無法想象,花時間(認真如5分鐘)來處理mostrecommendedway中的每一個都是可能的。並不是經常發生這種情況,WebRequest只是其中一種罕見的情況。

如果您的應用程序將具有重要的生命週期,那麼隨着時間的推移,您將發現自己正在爲這些例外中的每一個實現處理程序。沒有人喜歡「發生一般錯誤405」錯誤消息。這可能不是KISS,但是基礎就緒可以避免捕獲所有異常(如OutOfMemoryException),並且還可以防止FxCop警告(並且會從挑剔的開發人員中剔除)。

如果您在您的應用程序中生成大量的WebRequests,可能需要一個助手類,如下所示,它會引發一個單獨的WebFetcherException,並且還會提供更多有用的錯誤消息。下面是一個例子:

public static class WebFetcher 
{ 
    public WebResponse FetchFromUrl(Uri uri) 
    { 
     try 
     { 
      var request = WebRequest.Create(new Uri("MyUrl")) as HttpWebRequest; 
      return request.GetResponse(); 
     } 
     catch (NotSupportedException ex) 
     { 
      //you could customize the error messages to be more suitable for your 
      //application, or leaving room for future error handling 
      throw new WebFetcherException(ex.Message, ex); 
     } 
     catch (ArgumentNullException ex) 
     { 
      throw new WebFetcherException(ex.Message, ex); 
     } 
     catch (SecurityException ex) 
     { 
      throw new WebFetcherException(ex.Message, ex); 
     } 
     catch (ProtocolViolationException ex) 
     { 
      throw new WebFetcherException(ex.Message, ex); 
     } 
     catch (WebException ex) 
     { 
      throw new WebFetcherException(ex.Message, ex); 
     } 
     catch (InvalidOperationException ex) 
     { 
      throw new WebFetcherException(ex.Message, ex); 
     } 
    } 

    public class WebFetcherException : Exception 
    { 
     public WebFetcherException(string message, Exception inner) 
      : base(message, inner) 
     { } 
    } 
}