簡體   English   中英

C#“使用”語句並嘗試/捕獲

[英]C# “using” statement and try/catch

我今天一直在研究如何使用“ using”語句處置我的sql對象。 但是,我仍然對何時以及如何捕獲無法預料的錯誤感到困惑。 我這里有一個簡單的方法,希望您輸入正確的信息或者我做錯了什么?

private BindingList<My_Object> Search(int ID)
{
   string strSelectStatement = 
     "SELECT 'coloumns' " +
     "FROM 'table' " +
     "WHERE ID = @ID;";

     DataTable dt = new DataTable();
     try
     {
        using (SqlConnection sqlConn = new SqlConnection(m_SQLConnectionString))
        {
          using (SqlCommand cmd = new SqlCommand(strSelectStatement, sqlConn))
          {
            cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID;
            using (SqlDataAdapter adpt = new SqlDataAdapter(cmd))
            {
               adpt.Fill(dt);
            }
          }
        }

        My_Object myObject;
        BindingList<My_Object> myObjectList = new BindingList<My_Object>();

        foreach (DataRow row in dt.Rows)
        {
          myObject = new My_Object();
          //Fill/set myObject properties and add to myObject list
        }

        return myObjectList;
     }
     catch (Exception)
     {
        //throw the the exception with its stack trace up to the main call
        throw;
     }
}

因此,在運行adapter.Fill或構建myObject / list時,如果發生任何錯誤,我的捕獲將捕獲錯誤。

謝謝

不要捕獲“無法預料的”錯誤,因為如果真的無法預料,您將無能為力。

除非您當然希望以某種方式處理這些錯誤(例如,記錄消息),但是系統會為您執行這些操作,否則它們就不再是“不可預見的”,因為您已在期待它們。

至於張貼的代碼,有問題。 首先,可以說try / catch 嘗試太多,並且考慮到您在其中using s,這是沒有意義的(如果不會處理異常)。它還捕獲了一個通用異常,這在很大程度上泄氣; catch應制定適當的順序,以過濾出您可以處理的catch 僅僅throw也沒有意義。

如果您對此無能為力,請不要捕獲異常。 如果發現它們是為了清理非托管資源或用於日志記錄目的。

您可以看看MSDN“處理異常的最佳實踐” http://msdn.microsoft.com/zh-cn/library/seyhszts.aspx

在C#中。 using語句定義了要處置項目的范圍。 可以為實現IDisposable接口的任何對象調用此方法。

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

因此,如果您不必使用using塊,則可以在類上調用dispose方法以釋放/清理由對象創建的資源。

當調用實現IDisposable接口的類時,try / finally模式確保即使異常中斷了您的應用程序,也處置了非托管資源。

如果在using語句中拋出異常,則將繼續調用dispose。 您還可以使用using語句進行堆棧

using (SqlConnection sqlConn = new SqlConnection(m_SQLConnectionString))
using (SqlCommand cmd = new SqlCommand(strSelectStatement, sqlConn))
          {
            cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID;
            using (SqlDataAdapter adpt = new SqlDataAdapter(cmd))
            {
               adpt.Fill(dt);
            }
          }

關於異常處理。 捕獲所有異常嘗試捕獲類或方法引發的特定異常是不明智的。 您可以在msdn上查看異常詳細信息,以便使用SQLConnection: http : //msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.open.aspx

出現InvalidOperationException
如果不指定數據源或服務器,則無法打開連接。

要么

連接已打開。

SQLEXCEPTION
打開連接時發生連接級錯誤。 如果Number屬性包含值18487或18488,則表明指定的密碼已過期或必須重置。 有關更多信息,請參見ChangePassword方法。

因此,這些是您應滿足的例外情況。 希望有幫助!

您不需要try..catch {throw}。 這與根本沒有try..catch塊相同。

如果要記錄顯示友好信息的錯誤,則將代碼放在catch {}中。

即使代碼崩潰,仍將在SqlConnection上調用Dispose。

您可以在try語句的末尾捕獲多個異常。 這意味着您可以捕獲可能發生的每種不同類型的錯誤,即InvalidOperationException / SqlException。 MSDN在這里解釋:

http://msdn.microsoft.com/en-us/library/ms173162(v=vs.80).aspx

由於您已將整個代碼封裝在try / Catch中,因此它將捕獲try / catch代碼塊中引發的所有錯誤。 但是不要遵循這種方法,只能捕獲您要處理或記錄的那些錯誤。 建議這樣做,因為捕獲錯誤是一項開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM