C# try/catch和using语句

C# try/catch和using语句,c#,error-handling,C#,Error Handling,下面两组代码产生相同的结果,但我想知道哪一种是使用try…catch块包装的正确方法。他们两个有什么不同 编辑:以下哪项将正确捕获错误,并确保即使出现异常也会关闭连接 1. 2. 区别在于: 如果使用代码2,并且在using语句中使用的connString无效,它将引发异常,因为它不在try catch块中 在代码1中,它将捕获该异常。但是您将无法在catch块中使用SqlConnection,区别在于在2 SqlConnection中,conn对象将在catch块完成后被释放。在1中,您的连接

下面两组代码产生相同的结果,但我想知道哪一种是使用try…catch块包装的正确方法。他们两个有什么不同

编辑:以下哪项将正确捕获错误,并确保即使出现异常也会关闭连接

1. 2. 区别在于:

如果使用代码2,并且在using语句中使用的connString无效,它将引发异常,因为它不在try catch块中


在代码1中,它将捕获该异常。但是您将无法在catch块中使用SqlConnection,区别在于在2 SqlConnection中,conn对象将在catch块完成后被释放。在1中,您的连接将被释放,然后您将进入catch块。

两者都可以,这取决于您是否希望在打开连接时捕获错误,当然,您需要在完成连接后关闭连接。通常越早关闭越好。

我认为您知道异常处理。 我们在catch块中编写所有代码,这些代码可能导致应用程序出现可疑/未知行为。在这种情况下,catch块处理应用程序的可疑行为。 在上面两段代码的上下文中。。。。 对于第一个-由代码的任何一条语句引起的任何异常都将由catch块处理。 但对于第二个,catch块无法处理使用SqlConnection conn=new sqlconnectionconstring语句引起的异常,因为它在try块之外。要测试这一点,只需在sqlconnection中放置一些错误的连接字符串


希望这能让您更好地理解您的场景

using语句是表示try/catch/finally的语法快捷方式。您可以按照下面的方式修改代码,效果与上面的示例相同

        SqlConnection conn
        try
        {
            conn = new SqlConnection(connString)
            SqlCommand cmd = new SqlCommand("Drop Table sometable", conn);
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
        }
        catch
        {
            //
        }
        finally
        {
           if(conn != null)
           {
                conn.Dispose()
           }
       }

正确的意思是什么?两者都很好,只需在使用第二个示例时确保关闭catch中的连接。或者在finally块中关闭连接。请更正以下哪一项将正确捕获错误,并确保即使出现异常也会关闭连接。
using (SqlConnection conn = new SqlConnection(connString))
{
    try
    {
        SqlCommand cmd = new SqlCommand("Drop Table sometable", conn);
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
    }
    catch
    {
        //
    }
}
        SqlConnection conn
        try
        {
            conn = new SqlConnection(connString)
            SqlCommand cmd = new SqlCommand("Drop Table sometable", conn);
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
        }
        catch
        {
            //
        }
        finally
        {
           if(conn != null)
           {
                conn.Dispose()
           }
       }