以下两组代码产生相同的结果,但我想知道哪一个是使用try ... catch块进行包装的正确方法。它们中的两个有什么区别?
已编辑:其中哪一项会正确捕获错误,并确保即使出现异常也会关闭连接。
try
{
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand("Drop Table sometable", conn);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
}
}
catch
{
//
}
using (SqlConnection conn = new SqlConnection(connString))
{
try
{
SqlCommand cmd = new SqlCommand("Drop Table sometable", conn);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
}
catch
{
//
}
}
答案 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()
}
}