用于流的通用idposable包装器-捕获所有异常的替代方案
本文关键字:异常 方案 idposable 包装 用于 | 更新日期: 2023-09-27 17:50:02
所以我刚刚为一个抽象文件并在它包含的流上实现IDisposable
的类型编写了这个实现。它旨在用于任何项目:
public void Dispose()
{
if (_contentStream == null)
return;
lock (_contentStreamLocker)
{
if (_contentStream == null)
return;
try
{
_contentStream.Dispose();
}
catch (Exception)
{
//legitimate? - don't let any exception prevent
//us from successfully disposing?
}
_contentStream = null;
}
}
所以我感觉很脏,很明显,因为:
- 我正在捕捉
Exception
- 我不做任何与
Exception
但是,由于我不能保证底层流的行为(也考虑自定义实现)-即,如果它已经被处理,或者如果它处于实现决定不可能处理的状态-我真的不知道还能做什么。
显然我不应该隐藏Stream
的Dispose()
的坏实现;但我想这里有一个中途宿舍。
特别的是,这个对象不一定"拥有"流,因此不必总是对Dispose()
负责。因此,当流已被其他人处理时,它应该是容忍的。
显然,在大多数情况下,这不会是一个问题;也许在using
块中获得一个文件,读取它,对它做一些事情,然后处理它。但也有一些边缘情况;他们让我很烦!
最初我把它写为catch(ObjectDisposedException){ }
-但这只是一个非正式的模式,也不能依赖。
我该怎么办?保持这种状态,尽管例外吞下是坏的业力?大口只 ObjectDisposedException
,即使这不是更好吗?或者我应该完全不处理任何异常?
我能看到所有案例的优点;就是不知道他们谁赢。
一般来说,如果你不能确定哪一个胜出,那是因为将会有一些有用的信息不能"一般地"处理。在这种情况下,我认为最好让调用者处理它,因为他们将处于一个具体的情况下,使他们能够更好地判断。
流是如何引入到这个类的?如果您可以设计使它被传入,那么为什么不让调用者处理它的处置,而不让您自己关心它呢?StreamReader
承担这个责任一直困扰着我。如果没有,我也不在乎。
不要吞下异常,特别是用于外部使用的代码。
正如您所说的,如果您不拥有一次性物品,那么您不应该处置它。甚至不应该尝试调用Dispose.
请看我的回答。
处理迭代器块的参数
<标题> 更新
好的,你是否拥有一次性用品的问题并不能由谁创建了一次性用品来回答。所有权可以传递给其他类。一旦流被传递给StreamReader
,它将承担所有权。因此,流的创建者不必调用dispose,可以依靠StreamReader
来完成。
我建议您按照Microsoft指南来实现您的处置模式,如果您的包装器的客户端在基流上"拖了地毯",您应该让异常到达它们,以便它们可以处理它,或者至少知道它。