关于c#:try / catch和using语句

try/catch and using statements

本问题已经有最佳答案,请猛点这里访问。

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

已编辑:这其中哪一项将正确捕获错误,并确保即使出现异常,连接也将关闭。

1
2
3
4
5
6
7
8
9
10
11
12
13
try
{
    using (SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand cmd = new SqlCommand("Drop Table sometable", conn);
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
    }
}
catch
{
    //
}

1
2
3
4
5
6
7
8
9
10
11
12
13
using (SqlConnection conn = new SqlConnection(connString))
{
    try
    {
        SqlCommand cmd = new SqlCommand("Drop Table sometable", conn);
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
    }
    catch
    {
        //
    }
}


不同之处在于2中的sqlconnection conn对象将在catch块完成后释放。在1中,您的连接将被释放,然后您将结束在catch块中。


两者都很好,这取决于打开连接时是否要捕获错误,当然,完成连接后需要关闭连接。通常早点关门比较好。


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

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


区别在于:

如果您使用代码2,并且您在using语句中使用的控制无效,那么它将抛出一个异常,因为它不在try catch块中。

在代码1中,它只捕获那个异常。但在catch块中不能使用sqlconnection


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        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()
           }
       }