[英]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.