是否应该在必须在finally块中执行的try块中使用函数

时间:2010-07-08 08:21:38

标签: c# performance try-catch

try
{
  OpenConnection();
  RowsAffected = cmd.ExecuteNonQuery(); 
  CloseConnection(true); //should I use this function call here 
  //as well, when I am using it in finally 
  //block. For closing database connection.
}
catch (SqlException ex)
{ throw ex; }
finally
{ CloseConnection(true); }

或者我应该这样写呢

try
{
  OpenConnection();
  RowsAffected = cmd.ExecuteNonQuery(); 
}
catch (SqlException ex)
{ throw ex; }
finally
{ CloseConnection(true); }

4 个答案:

答案 0 :(得分:8)

不,无论try块中的代码是成功还是失败,都会始终执行finally块。在您的第一个示例中,连接将在成功时关闭两次。

您说您正在检查连接状态,这意味着在关闭连接两次时不会出现异常。不过,我认为仅在必要时尝试关闭它更合适。

答案 1 :(得分:1)

在这个特定的例子中,你实际上可以这样做:

using (var conn = new SqlConnection(...)) {
    // Do work
}

编译器对该语句的作用基本上是:

SqlConnection conn;
try {
  conn = new SqlConnection(...)
} finally {
  conn.Dispose();
}

或者左右......始终执行finally块,确保使用块始终调用Dispose。

这种方法的缺点是你无法捕获可能被抛出的SqlException,所以你最终会做这样的事情:

try {
  using (var conn = new SqlConnection(...)) {
    // Do work.
  }
} catch (SqlException ex) {

}

但编译后的代码最终代表:

try {
  SqlConnection conn;
  try {
    conn = new SqlConnection(...);
  } finally {
    conn.Dispose();
  }
} catch (SqlException ex) {

}

老实说虽然它可能不会在性能方面有任何不同,因为每当你抛出异常时,它都会受到性能影响。它确实始终调用Dispose。

答案 2 :(得分:0)

你的finally块总是被执行。使用像Dispose()这样的Close函数,CLose()应该在finally块

中使用

答案 3 :(得分:0)

你应该用第二种方式写作

                try 
                { 
                    OpenConnection(); 
                    RowsAffected = cmd.ExecuteNonQuery();  
                } 
                catch (SqlException ex) 
                { throw ex; } 
                finally 
                { CloseConnection(true); }