在某些情况下,如何处理类似于以下类的所有异常?
class Test : IDisposable {
public Test() {
throw new Exception("Exception in ctor");
}
public void Dispose() {
throw new Exception("Exception in Dispose()");
}
~Test() {
this.Dispose();
}
}
我试过了,但没用:
static void Main() {
Test t = null;
try {
t = new Test();
}
catch (Exception ex) {
Console.Error.WriteLine(ex.Message);
}
// t is still null
}
我也尝试过使用“using”,但它不处理从 ~Test() 抛出的异常;
static void Main() {
try {
using (Test t = new Test()) { }
}
catch (Exception ex) {
Console.Error.WriteLine(ex.Message);
}
}
有什么办法可以解决吗?
最佳答案
首先,Finalizer 应该绝不抛出异常。如果是这样,则说明出现了灾难性的错误,应用程序应该会严重崩溃。 Finalizer 也不应该直接调用 Dispose()。终结器仅用于释放非托管资源,因为一旦终结器运行,托管资源甚至可能不处于有效状态。托管引用已经被垃圾收集器清除,因此您只需在 Dispose 中处理它们,而不是在 Finalizer 中。
也就是说,如果您显式调用 Dispose,则应该捕获 Dispose 中的异常。我不太了解“使用”案例如何没有抛出异常。也就是说,如果可以避免的话,Dispose 也不应该抛出异常。特别是,在 using block 之后抛出异常的 Dispose 将“覆盖”在 using block 内可能发生的具有 Dispose 异常的任何异常。
一些额外的引用资料 here
关于c# - 如何处理 C# 类中的所有异常,其中 ctor 和终结器都抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671948/