如果在“using”语句中使用try / catch,是否会处置一次性资源?

时间:2015-04-17 15:28:24

标签: c# .net try-catch idisposable sqlconnection

我正在使用SqlConnectionSqlCommand

例如,如果有SqlException

,我必须捕获异常

我使用using子句并在其中嵌入try/catch block。这是代码:

public static void LogError(string error, string message)
{
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["connStringWeb"]))
    using (SqlCommand cmd = new SqlCommand("INSERT INTO errorLogTable (errorTime, errorType, error) VALUES(@errorTime, @errorText, @errorMsg)"))
    {
        cmd.CommandTimeout = 300;
        cmd.Connection = conn;
        cmd.Prepare();
        cmd.Parameters.AddWithValue("@errorTime", DateTime.Now);
        cmd.Parameters.AddWithValue("@errorText", error);
        cmd.Parameters.AddWithValue("@errorMsg", message);

        try
        {
           conn.Open();
           int i = cmd.ExecuteNonQuery();
        }
        catch { }
        }
   }
}

我的问题是,我的SqlConnectionSqlCommand会在发生异常的情况下被处理掉吗?这是处理它的好方法,或者我应该只使用旧时尚方法try/catch/finally块?

3 个答案:

答案 0 :(得分:4)

using语句只是try / finally块的语法快捷方式。所以是的,using中的对象将在抛出异常的情况下被处理掉。换句话说:

using(var foo = new Foo())
{
}

基本上编译成:

Foo foo;

try
{
    foo = new Foo();
}
finally
{
    foo.Dispose();
}

答案 1 :(得分:3)

您可以在using块内或using块外使用try catch。在这两种情况下,都将处理SqlConnection和SqlCommand。

但是,我更喜欢在use之外使用try catch来捕获所有错误,甚至是对象创建错误。

答案 2 :(得分:2)

在你的情况下,异常会在使用中被捕获,当你离开使用区块时会执行dispose。

但即使你把use块放在try catch之外并抛出异常,也会调用dispose。

public static void LogError(string error, string message)
{
    try
    {
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["connStringWeb"]))
            using (SqlCommand cmd = new SqlCommand("INSERT INTO errorLogTable (errorTime, errorType, error) VALUES(@errorTime, @errorText, @errorMsg)"))
            {
                cmd.CommandTimeout = 300;
                cmd.Connection = conn;
                cmd.Prepare();
                cmd.Parameters.AddWithValue("@errorTime", DateTime.Now);
                cmd.Parameters.AddWithValue("@errorText", error);
                cmd.Parameters.AddWithValue("@errorMsg", message);

                conn.Open();
                int i = cmd.ExecuteNonQuery();
            }
    }
    catch {}
}