用于流的通用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

但是,由于我不能保证底层流的行为(也考虑自定义实现)-即,如果它已经被处理,或者如果它处于实现决定不可能处理的状态-我真的不知道还能做什么。

显然我不应该隐藏StreamDispose()的坏实现;但我想这里有一个中途宿舍。

特别的是,这个对象不一定"拥有"流,因此不必总是对Dispose()负责。因此,当流已被其他人处理时,它应该是容忍的。

显然,在大多数情况下,这不会是一个问题;也许在using块中获得一个文件,读取它,对它做一些事情,然后处理它。但也有一些边缘情况;他们让我很烦!

最初我把它写为catch(ObjectDisposedException){ } -但这只是一个非正式的模式,也不能依赖。

我该怎么办?保持这种状态,尽管例外吞下是坏的业力?大口 ObjectDisposedException,即使这不是更好吗?或者我应该完全不处理任何异常?

我能看到所有案例的优点;就是不知道他们谁赢。

用于流的通用idposable包装器-捕获所有异常的替代方案

一般来说,如果你不能确定哪一个胜出,那是因为将会有一些有用的信息不能"一般地"处理。在这种情况下,我认为最好让调用者处理它,因为他们将处于一个具体的情况下,使他们能够更好地判断。

流是如何引入到这个类的?如果您可以设计使它被传入,那么为什么不让调用者处理它的处置,而不让您自己关心它呢?StreamReader承担这个责任一直困扰着我。如果没有,我也不在乎。

不要吞下异常,特别是用于外部使用的代码。

正如您所说的,如果您不拥有一次性物品,那么您不应该处置它甚至不应该尝试调用Dispose.

请看我的回答。

处理迭代器块的参数


<标题> 更新

好的,你是否拥有一次性用品的问题并不能由谁创建了一次性用品来回答。所有权可以传递给其他类。一旦流被传递给StreamReader,它将承担所有权。因此,流的创建者不必调用dispose,可以依靠StreamReader来完成。

我建议您按照Microsoft指南来实现您的处置模式,如果您的包装器的客户端在基流上"拖了地毯",您应该让异常到达它们,以便它们可以处理它,或者至少知道它。