Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception handling in class constructor

this case is bothering me since morning. Is it good practice to call garbage collector in class constructor if it throws Exception ? I have something like this:

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

}

The reason that I did it like this is that if it threw Exception (usualy NullreferenceException) I want to log it in text file and I don't need/want this object anymore. but is it good practice? If not how to do it properly?

like image 867
TrN Avatar asked May 24 '11 10:05

TrN


Video Answer


1 Answers

Your code doesn't call the garbage collector - it merely suppresses the finalizer, which is only important if your class has a finalizer, which is pretty unlikely.

It's fair enough to log the exception, but currently you're just catching it, which means the constructor will return with no errors. That's almost certainly not a good idea. I suggest you probably want:

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

Having said that, I would normally try to centralize exception handling anyway, putting it a long way up the call stack and putting all logging in there. It would be pretty rare to put the logging within a constructor, IMO.

Unless you've published the this reference from within your constructor, the newly created object will be eligible for garbage collection anyway - you don't need to do anything else. If you implement IDisposable in your class you should be careful to release any resources you've already required within the constructor, but in most cases you can just let the exception bubble up.

like image 58
Jon Skeet Avatar answered Sep 17 '22 12:09

Jon Skeet