【发布时间】:2010-04-20 01:17:39
【问题描述】:
在某些情况下,如何处理类似于以下类的所有异常?
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
}
我也尝试过使用“使用”,但它不能处理从 ~Test() 抛出的异常;
static void Main() {
try {
using (Test t = new Test()) { }
}
catch (Exception ex) {
Console.Error.WriteLine(ex.Message);
}
}
有什么想法可以解决吗?
【问题讨论】:
-
在第二种情况下(不使用),您从未真正调用过 Dispose()。 C# 是垃圾收集器,因此在 GC 决定是时候清理之前,实际上不会清理该类。 GC 也不会调用 Dispose(即使您定义了它),因此您可以在使用 IDisposable 类时使用“使用”或显式调用 Dispose。
-
感谢您的回答。事实上,Test 类不是我编写的,它只是为了演示目的,显示了一个我无法控制的具有类似行为的类。关键是,虽然构造函数抛出异常,但Test的对象是没有引用变量的半积。
标签: c# exception-handling finalizer