C#”;使用“;语句和try/catch
本文关键字:try catch 使用 语句 | 更新日期: 2023-09-27 17:59:18
我今天一直在研究如何使用"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;
}
}
所以,如果在运行适配器时出现任何问题,我的catch将捕获一个错误。填充,或者在构建myObject/list时填充。
感谢
在C#中。using语句定义了要处理的项的范围。这可以为实现IDisposable接口的任何对象调用。
http://msdn.microsoft.com/en-us/library/system.idisposable.aspx
因此,如果必须不使用using块,则可以调用类上的dispose方法来释放/清理对象创建的资源。
当调用实现IDisposable接口的类时,try/finaly模式确保即使异常中断应用程序,也会处理非托管资源。
如果在using语句的情况下引发异常,则仍将调用dispose。您也可以使用语句进行堆叠
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/en-us/library/system.data.sqlclient.sqlconnection.open.aspx
InvalidOperationException
在未指定数据源或服务器的情况下,无法打开连接。
或
连接已打开。
SqlException
打开连接时出现连接级别错误。如果Number属性包含值18487或18488,则表示指定的密码已过期或必须重置。有关详细信息,请参阅ChangePassword方法。
所以这些都是你应该考虑的例外情况。希望能有所帮助!
不要捕捉"不可预见"的错误,因为如果真的不可预见,你就无能为力。
当然,除非你希望以某种方式处理这些错误,比如记录消息——但系统会为你这样做——否则它们不再是"不可预见的",因为你期待着它们。
至于发布的代码,存在问题。首先,try / catch
可以说是尝试了太多,并且考虑到其中有using
,这是毫无意义的(如果不处理异常的话)。它还捕获了一个通用异常,这是非常不鼓励的;catch
es应该按照适当的顺序来过滤那些可以处理的内容。仅仅赶上throw
也是毫无意义的。
如果你对此无能为力,就不要捕捉异常。捕捉异常是为了清理非托管资源或用于日志记录。
您可以在MSDN上查看"处理异常的最佳实践"http://msdn.microsoft.com/en-us/library/seyhszts.aspx
您不需要尝试。。接球{投掷}。这和没有尝试过是一样的。。根本抓不住。
如果要记录显示友好消息的错误,请将代码放入catch{}中。
即使代码崩溃,仍将对SqlConnection调用Dispose。
您可以在try语句的末尾捕获多个异常。这意味着您可以捕获可能发生的每种不同类型的错误,即InvalidOperationException/SqlException。MSDN在此解释:
http://msdn.microsoft.com/en-us/library/ms173162(v=vs.80).aspx
由于您已经将整个代码封装在try/Catch中,它将捕获try/Catch代码块中引发的所有错误。但不要遵循这个方法,只捕捉那些你想要处理或记录的错误。建议这样做,因为捕获错误是一种开销。