2011-02-07 24 views
1

在我的目標中,我使用「運行代碼分析」在Visual Studio 2010中驗證了我的項目。在下面的功能我得到以下警告,我不明白,因爲這會產生一個異常的惟一行sqlC.ExecuteNonQuery(),與只有異常類型「的SQLException」。VS2010:代碼分析警告CA2000。對象不會沿着所有異常路徑排列

CA2000:Microsoft.Reliability:在方法 'Company.log(字符串,字符串,日期時間,日期時間,字符串布爾)',對象 'SQLC' 不是沿着所有的異常路徑設置。在所有對它的引用超出範圍之前,調用System.IDisposable.Dispose對象'sqlC'。

爲什麼分析會抱怨?任何幫助深表感謝!

private void log(string type, string descr, DateTime start, DateTime end, string msg, bool success) 
    { 
     SqlCommand sqlC = new SqlCommand(); 
     sqlC.CommandType = CommandType.Text; 
     sqlC.Connection = sc; 
     sqlC.CommandText = "INSERT INTO [cap_jobHistoryDetails] (...) VALUES(...)"; 
     sqlC.Parameters.AddWithValue("@jobID", _job_id.ToString("d", CultureInfo.InvariantCulture)); 
     sqlC.Parameters.AddWithValue("@type", type); 
     sqlC.Parameters.AddWithValue("@start", start); 
     sqlC.Parameters.AddWithValue("@end", end); 
     sqlC.Parameters.AddWithValue("@descr", descr); 
     sqlC.Parameters.AddWithValue("@msg", msg); 
     sqlC.Parameters.AddWithValue("@success", (success ? "1" : "0")); 

     try 
     { 
      sqlC.ExecuteNonQuery(); 
     } 
     catch (SqlException) 
     { 
      sqlC.Dispose(); 
      throw; 
     } 
     sqlC.Dispose(); 
    } 

回答

7

去閱讀,如果有usingusing blocks

此代碼將獲得更短,更正確。

如果不正確地處理sqlC,有幾種方法可以讓異常轉義。 .NET使用半同步異常模型,事實上任何一行託管代碼都可能拋出(例如ThreadAborted異常)。或者sqlC.ExecuteNonQuery()可能會拋出不同類型的異常。

+1

哦,我現在在笑!你不僅解決了問題,而且使代碼更加美麗。 – David 2011-02-07 15:04:33

2

鑑於您只捕獲一個異常(即使您重新拋出異常) - 如果執行任何異常,try/catch塊都不會執行。異常會中斷正常流程,所以在異常執行後沒有任何事情發生。 (除非它在正確類型的異常catch塊中,或者finally塊...)

如果要確保代碼始終在try/catch後執行,請在塊的末尾使用finally

但是在IDisposable對象的情況下,using塊會像Ben Voigt所說的那樣處理這個問題。

相關問題