如果在 "using" 语句中使用 try/catch ,是否会释放一次性资源?
Will be Disposable resource disposed if try/catch is used inside "using" statement?
我正在与 SqlConnection
和 SqlCommand
合作。
我必须捕获异常,例如,如果有 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 { }
}
}
}
我的问题是,如果出现异常,我的 SqlConnection
和 SqlCommand
会被处理吗?这是处理它的好方法,还是我应该简单地使用老式方法使用 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 {}
}
我正在与 SqlConnection
和 SqlCommand
合作。
我必须捕获异常,例如,如果有 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 { }
}
}
}
我的问题是,如果出现异常,我的 SqlConnection
和 SqlCommand
会被处理吗?这是处理它的好方法,还是我应该简单地使用老式方法使用 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 {}
}