如果在 "using" 语句中使用 try/catch ,是否会释放一次性资源?

Will be Disposable resource disposed if try/catch is used inside "using" statement?

我正在与 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 块?

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

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

基本上编译成:

Foo foo;

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

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

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

在你的例子中,异常是在 using 中捕获的,当你离开 using 块时执行处置。

但即使将 using 块放在 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 {}
}