C# 流的通用IDisposable包装器-捕获所有异常的替代方法
因此,我刚刚为一个类型编写了这个实现,该类型抽象了一个文件,并在它包含的流上实现了C# 流的通用IDisposable包装器-捕获所有异常的替代方法,c#,.net,C#,.net,因此,我刚刚为一个类型编写了这个实现,该类型抽象了一个文件,并在它包含的流上实现了IDisposable。其拟用于任何项目: public void Dispose() { if (_contentStream == null) return; lock (_contentStreamLocker) { if (_contentStream == null) return; try { _contentStream.Dispo
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;
}
}
很明显,我觉得自己很脏,因为:
- 我正在捕获异常
- 我没有做任何异常处理
Stream
的Dispose()
的糟糕实现;但我认为这里有一个中途之家
特别是,这个对象不一定“拥有”流,因此不必总是负责Dispose()
ing。因此,它应该能够容忍流被其他人处理的情况
显然,在大多数情况下,这不是一个问题;使用块获取中的文件,读取它,对其进行处理,然后处理它。但也有一些边缘案例;他们打扰我了
最初我将其编写为catch(ObjectDisposedException){}
——但这只是一种非正式的模式,也不能依赖
我该怎么办?保持这样,尽管例外吞咽是坏的因果报应?只吞咽ObjectDisposedException
,即使这样也没什么好处?或者我应该一点也不例外地吞咽或处理吗
在所有情况下,我都能看到优点;一般来说,如果你不知道哪一个赢了,那是因为有一些有用的信息无法“一般”处理。在这种情况下,我认为最好让打电话的人来处理,因为他们将处于一个具体的情况下,这样他们可以更好地判断
这个流是如何引入这个类的?如果你能设计出这样的方式来传递信息,那么为什么不让打电话的人来处理它,而不去关心它呢。StreamReader
承担了这个责任,这一直困扰着我。如果不是的话,我也不在乎
不要吞下例外情况,特别是在用于外部消费的代码中。正如您所说,如果您没有一次性用品,则不应处置它。你甚至不应该临时打电话给Dispose
看看我的答案
更新
好的,你是否拥有一次性用品的问题并不是由谁创造的。所有权可以传递给其他类StreamReader
将在流传递给它时承担所有权。因此,流的创建者不必调用dispose,可以依靠StreamReader
来完成这项工作。我建议您要根据实现dispose模式,如果包装器的客户端在基本流上“拉地毯”,您应该让异常进入,以便他们能够处理它,或者,至少要知道这一点。如果该流对您的类是私有的,您会怎么处理它?这条流公开了吗?@Jodrell-好问题-这条流可以被设置到对象中。该类实现了一个get/set接口,以便调用者可以填写文件对象并将其提供给服务,并从服务中检索文件及其流。该环境非常抽象。因为StreamReader
将假定拥有它。你可以被传递一个流并夺走所有权。吞咽对象处理异常和最终确定异常是可以的。翻译:“潜在的默默泄漏资源和打破后条件是可以的”这是一个公平的观点。让打电话的人意识到他们搞砸了。