相关疑难解决方法(0)

你应该实现IDisposable.Dispose(),以便它永远不会抛出?

对于C++(析构函数)中的等效机制,建议通常不应抛出任何异常.这主要是因为这样做可能会终止您的流程,这很少是一个好策略.

在.NET的等效场景中......

  1. 抛出第一个异常
  2. 作为第一个异常的结果,执行finally块
  3. finally块调用Dispose()方法
  4. Dispose()方法抛出第二个异常

...您的流程不会立即终止.但是,由于.NET无法用第二个异常替换第一个异常,因此会丢失信息.因此,调用堆栈上某处的catch块将永远不会出现第一个异常.然而,人们通常对第一个例外更感兴趣,因为这通常会提供更好的线索,说明为什么事情开始出错.

由于.NET缺少一种机制来检测代码是否在异常处于挂起状态时被执行,因此似乎只有两种选择可以实现IDisposable:

  • 始终吞下Dispose()中发生的所有异常.不好,因为你可能最终吞下OutOfMemoryException,ExecutionEngineException等等,我通常宁愿在它们发生时拆除它而没有另外的异常已经挂起.
  • 让所有异常传播出Dispose().不好,因为您可能会丢失有关问题根本原因的信息,请参阅上文.

那么,两个邪恶中哪一个较小?有没有更好的办法?

编辑:为了澄清,我不是在谈论积极抛出Dispose()或不抛出异常,我说的是让Dispose()调用的方法抛出的异常传播出Dispose()或不传播,例如:

using System;
using System.Net.Sockets;

public sealed class NntpClient : IDisposable
{
    private TcpClient tcpClient;

    public NntpClient(string hostname, int port)
    {
        this.tcpClient = new TcpClient(hostname, port);
    }

    public void Dispose()
    {
        // Should we implement like this or leave away the try-catch?
        try
        {
            this.tcpClient.Close(); // Let's assume that this might throw
        }
        catch
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# idisposable

54
推荐指数
3
解决办法
5845
查看次数

标签 统计

.net ×1

c# ×1

idisposable ×1