当前位置:  开发笔记 > 编程语言 > 正文

finally块中的Multipule操作

如何解决《finally块中的Multipule操作》经验,为你挑选了1个好方法。

让我们说你有一些资源清理如下:这是C#.

try{/*stuff*/}
catch(Exception e) {/*rollback logs etc.*/}
finally{
 if( context.Transaction != null )
  context.Transaction.Dispose();
 context.Connection.Close();
 context.Connection.Dispose();
}

相反,这样做会更强大吗?

try{/*stuff*/}
catch(Exception e) {/*rollback logs etc.*/}
finally{
 try{
  if( context.Transaction != null )
   context.Transaction.Dispose();
 }catch(Exception e){/*logs*/}
 finally{
  context.Connection.Close();
  context.Connection.Dispose();
 }
}

这样,如果transaction.dispose在leat处设置为失败,则连接将有机会关闭.



1> Richard..:

相反,这样做会更强大吗?

多个使用块你会更好.

首先,你的捕获块将吃掉所有异常并且不需要(可以尝试...最后没有任何捕获).如果您可以处理(或增加值)异常,则仅使用catch.

但更好的是:

using (var resA = GetMeAResourceNeedingCleanUp())
using (var resB = new AnotherResourceNeedingCleanUpn(...)) {
  // Code that might throw goes in here.
}

NB.一旦异常回退,最后块正在清理,抛出另一个异常可能会导致(充其量)混淆正在处理哪些异常.第二条准则:

不要从Dispose方法或终结器中抛出异常.如果您需要允许用户处理清理失败,请提供单独的Close方法,该方法可以报告其失败.

请注意,在"框架设计指南"(2 ED)有这样的(§9.4.1):

避免在Dispose(bool)中抛出异常,除非在包含进程已被破坏的临界情况下(泄漏,不一致的共享状态等).

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有