try / catch和using语句

时间:2014-05-01 14:58:31

标签: c# error-handling

以下两组代码产生相同的结果,但我想知道哪一个是使用try ... catch块进行包装的正确方法。它们中的两个有什么区别?

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

1

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

2

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

5 个答案:

答案 0 :(得分:3)

区别在于#2 SqlConnection conn对象将在catch块完成后处理。在#1中,您的连接将被处理掉,而您将最终进入捕获区。

答案 1 :(得分:2)

如果你想在打开连接时发现错误,那么两者都很好,当然你需要在完成连接后关闭连接。通常先关闭更好。

答案 2 :(得分:1)

区别在于:

如果您使用代码2,并且您在using语句中使用的connString无效,则会抛出异常,因为它不在try catch块中。

在代码1中,它只会捕获该异常。但是你将无法在catch块中使用你的SqlConnection

答案 3 :(得分:1)

我知道你知道异常处理。 我们在catch块中编写了所有代码,这些代码可能会对我们的应用程序产生可疑/未知行为。在这种情况下,catch块处理我们的应用程序的可疑行为。 在您的上述两个代码块的上下文中.... 对于第一个 - 任何一个代码语句引起的任何异常都将由catch块处理。 但对于第二个 - 由"使用(SqlConnection conn = new SqlConnection(connString))"引起的异常。您的catch块无法处理语句,因为它位于try块之外。要测试这个,只需在sqlconnection中放置一些错误的连接字符串。

希望这会让您更好地了解您的场景。

答案 4 :(得分:0)

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()
           }
       }