关闭try / catch块

时间:2015-12-09 16:39:20

标签: c# sql .net exception

sc是从调用函数传入的SQL连接 我在整个程序中使用一个SQL连接,并打开每个子功能并根据需要关闭它。 (我读到这很好,因为SQLConnection类有它自己的连接池功能)

        string q = "this would be a query";
        using (SqlCommand cmd = new SqlCommand(q, sc))
        {
            cmd.Parameters.Add("@ID", SqlDbType.Int);
            cmd.Parameters["@ID"].Value = (an id that is passed in);
            try
            {
                sc.Open();
                using (var reader = cmd.ExecuteReader())
                {
                   if(reader.read())
                   { logic that might throw exception }
                   else
                   { logic that might throw exception }
                }
                sc.Close();
            }
            catch (Exception e)
            {
                alert user, program does not halt but current function returns
            }
        }

因此连接打开,命令尝试执行,并执行一些可能引发异常的逻辑。 (我没想到)这个函数是处理大型数据集的大型程序的一部分。如果它因为异常而失败则需要注意它,但它也需要尝试继续运行。

该程序的其他部分正在共享此连接,并在需要时打开和关闭它,并且我已将此基本模板用于程序中的所有查询。

我刚刚想到,如果发生异常,可能无法关闭连接。我认为这是正确的吗?写这个时我最初的担心是sc.Open()会引发异常,但是我已经在多个地方使用过这个,我意识到这是短视的,因为连接可以打开然后关闭之间任意数量的步骤都可能引发异常。

我是否需要其他逻辑以确保此连接已关闭且程序可以尝试继续运行?

如果我的理解是正确的,在打开和关闭之间发生异常时需要关闭连接我认为我有两个选择:

  1. 在开放和关闭之间尝试/捕捉
  2. catch块中的sc.Close()(额外关注:如果sc.Open()抛出异常并且catch块尝试sc.Close()会抛出另外的异常吗?)

4 个答案:

答案 0 :(得分:2)

需要担心关闭连接。当连接由创建连接的using语句处理时,它将自动关闭。

如果发生异常,连接仍将被处理(并因此关闭),因为using语句的设计方式如何。

答案 1 :(得分:1)

您可以使用SqlConnection的State属性来确定上次网络操作离开连接的状态。此属性在此处描述:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx

我建议单独对SqlConnection(例如Open)和SqlCommand中的异常做出反应,因为根据我的经验,您通常会想要采取不同的操作。即使你想采取整体方法, 如果您无法打开连接,那么准备查询就没有意义, 你可能想要说一些与无法打开连接有关的事情,而不是查询失败。我会在创建SqlCommand之前移动sc.Open()并尝试/捕获它。

答案 2 :(得分:0)

对@roryap的上述答案进行澄清 - 如果您的连接是在using语句中创建的,则不需要sc.Close(),但是根据您的问题,我猜不是。在这种情况下,您应该将一个finally部分添加到try catch块并关闭其中的连接。

答案 3 :(得分:0)

最好在finally块中关闭连接

finally
{
   sc.Close(); 
}

在try块完成后,finally块将起作用。 在异常的情况下,finally块也有效。 因此,无论如何连接都将关闭。