我读过这样的一种用法:
using (myObject)
{
myObject.DoStuff();
}可以这样想:
try
{
myObject.DoStuff();
}
finally
{
myobject.Dispose()
}因此,如果myObejct.DoStuff抛出ExceptionA,然后myObject.Dispose()也抛出异常(ExceptionB),那么ExceptionA将丢失。(有关更好的描述,请参见这里的MSDN示例。)
这是否意味着如果使用块代码中的代码可能引发异常(这是大多数代码对吗?)那么using语句是一种糟糕的实践吗?
发布于 2012-03-26 19:14:17
这是否意味着如果使用块代码中的代码可能引发异常(这是大多数代码对吗?)那么使用语句是一种错误的做法吗?
不是的。
然后myObject.Dispose()也抛出一个异常
这是你问题的症结所在。
这就是“糟糕的做法”。应该真正设计IDisposable.Dispose实现,以便它们不会引发异常,除非是在真正无法恢复的情况下。
由于IDisposable实际上是为了释放所讨论的资源,所以主要的问题应该是确保在大多数情况下不会抛出这个实现。拥有一个清理方法抛出会引起很多的悲伤--这也是使用语句不应与WCF客户端一起使用等的原因。
话虽如此,我不认为使用语句本身是一个不好的做法。事实上,它往往是一种非常好的实践,因为它避免了一个非常常见的陷阱(在异常情况下缺少资源的一次性使用)。
发布于 2012-03-26 19:12:37
发布于 2012-03-26 19:13:12
这是WCF中常见的问题,Dispose()经常抛出异常。有一种包装一次性的方法,这样您就可以继续获得the ()语句的好处,而不会导致异常丢失。它本质上吞噬了在Dispose过程中抛出的任何异常,因此原始异常总是抛出到更高上下文的异常。
http://marcgravell.blogspot.com/2008/11/dontdontuse-using.html
https://stackoverflow.com/questions/9878216
复制相似问题