如何处理c#和finalizer抛出异常的C#类中的所有异常?

Fra*_*ank 2 c# exception-handling finalizer

在某些情况下,如何处理类似于以下类的所有异常?

class Test : IDisposable {
  public Test() {
    throw new Exception("Exception in ctor");  
  }
  public void Dispose() {
    throw new Exception("Exception in Dispose()");
  }
  ~Test() {
    this.Dispose();
  }
}
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它不起作用:

static void Main() {
  Test t = null;
  try {
    t = new Test();
  }
  catch (Exception ex) {
    Console.Error.WriteLine(ex.Message);
  }

  // t is still null
}
Run Code Online (Sandbox Code Playgroud)

我也尝试使用"使用"但它不处理从~Test()抛出的异常;

static void Main() {
  try {
    using (Test t = new Test()) { }
  }
  catch (Exception ex) {
    Console.Error.WriteLine(ex.Message);
  }
}
Run Code Online (Sandbox Code Playgroud)

任何想法我该如何解决?

Dan*_*ant 5

首先,Finalizer 永远不应该抛出异常.如果确实如此,那么事情就会发生灾难性的错误,应用程序应该会崩溃.Finalizer也不应该直接调用Dispose().终结器仅用于释放非托管资源,因为一旦Finalizer运行,托管资源甚至可能不处于有效状态.垃圾收集器已经清理了托管引用,因此您只需要在Dispose中处理它们,而不是在Finalizer中.

也就是说,如果你明确地调用Dispose,就应该捕获Dispose in Dispose.我对"使用"案例没有抛出异常没有很好的理解.也就是说,如果可以避免异常,Dispose也不应该抛出异常.特别是,在使用块之后抛出异常的Dispose将"覆盖"具有Dispose异常的using块内可能发生的任何异常.


这里有一些额外的参考资料