gpt4 book ai didi

c# - 如何处理 C# 类中的所有异常,其中 ctor 和终结器都抛出异常?

转载 作者:行者123 更新时间:2023-11-30 19:33:55 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com