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)
任何想法我该如何解决?
首先,Finalizer 永远不应该抛出异常.如果确实如此,那么事情就会发生灾难性的错误,应用程序应该会崩溃.Finalizer也不应该直接调用Dispose().终结器仅用于释放非托管资源,因为一旦Finalizer运行,托管资源甚至可能不处于有效状态.垃圾收集器已经清理了托管引用,因此您只需要在Dispose中处理它们,而不是在Finalizer中.
也就是说,如果你明确地调用Dispose,就应该捕获Dispose in Dispose.我对"使用"案例没有抛出异常没有很好的理解.也就是说,如果可以避免异常,Dispose也不应该抛出异常.特别是,在使用块之后抛出异常的Dispose将"覆盖"具有Dispose异常的using块内可能发生的任何异常.
这里有一些额外的参考资料