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
始终执行