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

标签 c# exception finalizer

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

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/

相关文章:

c# - Dynamodb 中 client.query 和 Table.query 之间的区别

c# - 具有特殊字符的正则表达式嵌套结构

c++ - 从谷歌日志库的 CHECK 宏中捕获 C++ 异常

java - 从具有 Java 构造函数抛出异常的类进行子类化

c++ - 使用 __debugbreak() 尝试/捕获

c# - 是否可以使返回三元表达式结果的 return 语句不返回三元表达式的一个分支?

c# - 仅当记录不存在时才通过存储过程从 TVP 列表中插入项目 - 性能低下

c# - 为什么在这个非常简单的场景中我的 .net 析构函数没有被调用?

.net - 调用 Dispose 方法会清除和压缩 .Net 中的内存吗?

c# - Java 和 C# 的终结器