类构造函数中的异常处理

本文关键字:异常处理 构造函数 | 更新日期: 2023-09-27 17:57:25

这种情况从早上开始就困扰着我。如果垃圾收集器抛出异常,在类构造函数中调用垃圾收集器是好的做法吗?我有这样的东西:

public MyClass(/* some arguments */)
{
    try 
    {
      //do stuff...
    } catch(Exception e) {
      //do stuff, save logfile
      GC.SuppressFinalize(this);
    }
}

这样做的原因是,如果它抛出异常(通常是空引用异常(,我想将其记录在文本文件中,并且我不再需要/想要这个对象。 但这是好的做法吗?如果不是,如何正确地做到这一点?

类构造函数中的异常处理

你的代码不调用垃圾收集器 - 它只是抑制终结器,这只有在你的类有一个终结器时才重要,这不太可能。

记录异常是公平的,但目前你只是捕获它,这意味着构造函数将返回没有错误。这几乎肯定不是一个好主意。我建议你可能想要:

try 
{
  //do stuff...
} catch(Exception e) {
  //do stuff, save logfile
  throw;
}

话虽如此,我通常会尝试集中异常处理,将其放在调用堆栈的较远处,并将所有日志记录放在那里。将日志记录放在构造函数 IMO 中是非常罕见的。

除非从构造函数中发布了this引用,否则新创建的对象无论如何都有资格进行垃圾回收 - 您无需执行任何其他操作。如果你在类中实现IDisposable,你应该小心地释放构造函数中已经需要的任何资源,但在大多数情况下,你可以让异常冒泡。