C# 在使用前尝试Catch,反之亦然?

C# 在使用前尝试Catch,反之亦然?,c#,try-catch,database-connection,using,idisposable,C#,Try Catch,Database Connection,Using,Idisposable,我的做法是让try catch block在中使用block而不是相反。然而,最近,我被告知这不是正确的道路。正如他们所说,在这种方法下,数据库连接无法正常关闭 下面是我如何实现它的示例块: using(var dbConn = new MySqlConnection(dbConnStr)) { using(var dbTrans = dbConn.BeginTransaction()) { try { ... ...

我的做法是让
try catch block
中使用block
而不是相反。然而,最近,我被告知这不是正确的道路。正如他们所说,在这种方法下,数据库连接无法正常关闭

下面是我如何实现它的示例块:

using(var dbConn = new MySqlConnection(dbConnStr)) {
    using(var dbTrans = dbConn.BeginTransaction()) {
       try {
           ...
           ...
           ...

           return some_results_here;
        }
        catch(Exception Ex) {
            throw;
        }
    }
}
因此,我被告知,无论是
dbConn
还是
dbTrans
都不会自动处理(与我的想法相反,因为它们都是一次性的,并且在使用语句中),并且连接保持打开状态。现在,如果真的是这样,我感到困惑和沮丧。因为这是我在几乎所有项目上的实践,我一直在工作,我没有遇到这样的问题


请用这个神话来澄清我。谢谢大家。

在使用
之前或之后放置
try…catch
并不重要,因为
使用
只是
try…finally
的简写,并调用dispose

使用类似于此:

IDisposable d = (the assignment);

try
{
}
finally
{
    if (d != null)
        d.Dispose();
}

除了一些边缘情况外,在这两种情况下,您的
使用
实例都会得到处理。

使用
之前或之后放置一个
try…catch
并不重要,因为
使用
只是调用dispose的
try…finally
的简写

使用类似于此:

IDisposable d = (the assignment);

try
{
}
finally
{
    if (d != null)
        d.Dispose();
}

除了一些边缘情况外,在这两种情况下,您的
使用
实例将得到处理。

Patrick的回答完美地澄清了这个问题,但是作为额外的支持,直接来自

通常,当您使用IDisposable对象时,应该声明和 在using语句中实例化它。using语句调用 以正确的方式在对象上处置方法,以及(当您使用它时 如前所示),它还会导致对象本身超出范围 只要调用Dispose。在使用块中,对象是 只读,无法修改或重新分配

using语句 确保即使在运行时发生异常,也会调用Dispose 正在对对象调用方法。您可以通过以下方式获得相同的结果: 将对象放入try块中,然后在 最后阻塞;事实上,using语句就是这样翻译的 由编译器完成。前面的代码示例扩展为以下内容 编译时的代码(注意额外的花括号来创建 对象的有限范围):


您还可以很容易地找到关于以下内容的讨论:。总而言之,它会解决的。

帕特里克的回答完美地澄清了这个问题,但作为额外的支持,直接来自

通常,当您使用IDisposable对象时,应该声明和 在using语句中实例化它。using语句调用 以正确的方式在对象上处置方法,以及(当您使用它时 如前所示),它还会导致对象本身超出范围 只要调用Dispose。在使用块中,对象是 只读,无法修改或重新分配

using语句 确保即使在运行时发生异常,也会调用Dispose 正在对对象调用方法。您可以通过以下方式获得相同的结果: 将对象放入try块中,然后在 最后阻塞;事实上,using语句就是这样翻译的 由编译器完成。前面的代码示例扩展为以下内容 编译时的代码(注意额外的花括号来创建 对象的有限范围):

您还可以很容易地找到关于以下内容的讨论:。总之,它将进行处置。

回答您的问题,特别是关于using块中的抛出停止了代码运行的进一步进程的断言(因此using块中的资源永远不会被处置)

根据微软文档 “using语句确保即使在调用对象上的方法时发生异常,也会调用Dispose。”

注意:我不能100%肯定这适用于.NET framework的每个版本。如果有疑问,我建议进行测试。

回答您的问题,特别是关于using块中的抛出停止了代码运行的进一步进程的断言(因此using块中的资源永远不会被释放)

根据微软文档 “using语句确保即使在调用对象上的方法时发生异常,也会调用Dispose。”


注意:我不能100%肯定这适用于.NET framework的每个版本。如果有疑问,我建议进行测试。

我不明白为什么它们不能在这里正确关闭。告诉你这件事的人能详细说明他们为什么这么想吗?使用
块基本上编译成
try/finally
块,离开该块时总是执行
finally
。(除了极端的例子,如关键系统故障或断电)也许提出这一主张的人可以用一个实际的例子来证明为什么这是不好的?谁告诉你这是错误的。使用
语句实现
IDisposable
,从而正确地处理它。或者你的同事不知道使用
-block将
IDisposable
封装到
中会自动调用
dispose
,从而
关闭
(如果存在),或者他们只是没有仔细阅读代码。无论哪种方式,您的连接都将被关闭。此外,您应该删除try-catch。如代码所示,您的try-catch完全没有任何作用。我不明白为什么它们不能在这里正确关闭。告诉你这件事的人能详细说明他们为什么这么想吗?使用
块的
基本上编译成
try/finally
块和
finally
始终执行