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#”;使用“;语句和try/catch

在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,这是毫无意义的(如果不处理异常的话)。它还捕获了一个通用异常,这是非常不鼓励的;catches应该按照适当的顺序来过滤那些可以处理的内容。仅仅赶上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代码块中引发的所有错误。但不要遵循这个方法,只捕捉那些你想要处理或记录的错误。建议这样做,因为捕获错误是一种开销。