我正在使用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
块?
答案 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 {}
}