类构造函数中的异常处理

8

这个问题困扰我一整个早上了。如果类构造函数抛出异常,调用垃圾回收器是一个好的实践吗?我的代码类似于:

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

}

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

1
你的类是否有终结器?如果没有,那么调用 GC.SuppressFinalize 是完全无意义的。 - LukeH
1个回答

18

你的代码没有调用垃圾回收器,它只是抑制了finalizer,只有当你的类 finalizer 时才很重要,这种情况相当罕见。

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

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

尽管如此,我通常会尝试集中处理例外情况,将其放在调用堆栈的较高位置,并在那里放置所有记录。在我的看法中,在构造函数内部放置日志记录是相当罕见的。

除非你已经从构造函数中发布了this引用,否则新创建的对象将自动符合垃圾回收的条件 - 你不需要做任何其他事情。如果你在类中实现了IDisposable,你应该小心释放已在构造函数中获取的任何资源,但在大多数情况下,你可以让异常向上传播。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接