有没有办法在dispose中检测异常?

时间:2017-11-16 16:33:15

标签: c#

我有以下情况:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using (new Foo())
            {
                throw new Exception("Inside using block");
            }
        }
        catch (Exception e)
        {

        }
    }
}

public class Foo : IDisposable
{
    public void Dispose()
    {
        throw new Exception("Inside dispose");
    }
}

"Inside using block"的{​​{1}}方法获取抛出的异常 - Dispose - 并使其成为Foo InnerException Exception

修改

例如:

Inside dispose

1 个答案:

答案 0 :(得分:4)

根据框架设计指南(Cwalina,Abrams),第9.3节:

  

避免在Dispose(bool)中抛出异常,除非在包含进程已损坏的严重情况下。

     

如果Dispose可能引发异常,则最终阻止清除逻辑将不会执行。要解决这个问题,用户需要在try块中包含对Dispose的每次调用(在finally块中!),这会导致非常复杂的清理处理程序。如果执行Dispose(bool)方法,如果disposing为false,则不要抛出异常。

同样来自第9.3节:

  

避免使类型最终化。仔细考虑您认为需要终结器的任何情况。从性能和代码复杂性的角度来看,与终结器实例相关的实际成本。"