如何处理Dispose抛出的异常?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (101)

我的代码:

public class SomeClass: IDisposable
{
    void Dispose()
    {
       if (m_foo != null)
       {
          m_foo.Dispose();
       }
       if (m_bar != null)
       {
          m_bar.Dispose();
       }   
    }

    private Foo m_foo;

    private Bar m_bar;

}

我担心Foo.Dispose可能会抛出一个异常,所以下面的代码不会被执行,所以m_bar不会被丢弃。

由于Foo / Bar可能来自第三方,因此不保证不抛出异常。

处理这个问题的最佳做法是什么?

提问于
用户回答回答于

如果Dispose()在终结上下文中被调用并且抛出异常,那么你的进程将被终止。

如果你怀疑Foo.Dispose()抛出了异常,我会尽可能将其丢弃,然后将其封装在try / catch中, 将参考设置为null。从Dispose()中抛出异常应该避免。

用户回答回答于

它确实可以泄漏你的dispose方法的异常,尤其是因为实现IDisposable的东西通常会指定一个将调用Dispose的终结器。

问题在于,通过处理异常来清除地毯下的问题可能会给您带来一些非常难以调试的情况。如果你的IDisposable分配了仅在处置后才被释放的关键部分,该怎么办?如果你忽略异常发生的事实,你可能会陷入死锁。这一切都取决于被丢弃的对象,因为有些对象可能可以恢复,有些则不可以。作为一般的经验法则,Dispose在正确使用时不应该抛出异常,并且你不应该在你调用的嵌套Dispose方法中针对异常进行防御性编码。

所属标签

可能回答问题的人

  • 华讯云

    0 粉丝0 提问7 回答
  • gulu丶咕噜

    0 粉丝1 提问5 回答
  • 卓脑域名

    0 粉丝0 提问3 回答
  • 女淘日记

    杭州吱吱吱科技 · 站长 (已认证)

    1 粉丝1 提问3 回答

扫码关注云+社区

领取腾讯云代金券