Ausnahmebehandlung im Klassenkonstruktor

8

Dieser Fall stört mich seit dem Morgen. Ist es ratsam, den Garbage Collector im Klassenkonstruktor aufzurufen, wenn Exception ausgelöst wird? Ich habe so etwas:

%Vor%

Der Grund, warum ich es so gemacht habe, ist, dass wenn ich Exception (normalerweise NullreferenceException) geworfen habe, möchte ich es in eine Textdatei schreiben und ich brauche dieses Objekt nicht mehr. Aber ist es eine gute Übung? Wenn nicht wie es richtig gemacht wird?

    
TrN 24.05.2011, 10:46
quelle

1 Antwort

16

Ihr Code ruft den Garbage Collector nicht auf - er unterdrückt lediglich den Finalizer, was nur wichtig ist, wenn Ihre Klasse einen Finalizer hat, was ziemlich unwahrscheinlich ist.

Es ist fair genug, die Ausnahme zu protokollieren, aber momentan fangen Sie nur ab, was bedeutet, dass der Konstruktor ohne Fehler zurückkommt. Das ist mit ziemlicher Sicherheit keine gute Idee. Ich schlage vor, dass Sie wahrscheinlich wollen:

%Vor%

Nachdem ich das gesagt habe, würde ich normalerweise versuchen, die Exception-Behandlung trotzdem zu zentralisieren, indem ich den Aufruf-Stack weit nach oben führe und die gesamte Anmeldung dort einstelle. Es wäre ziemlich selten, die Protokollierung in einen Konstruktor, IMO, zu legen.

Wenn Sie den Verweis this nicht innerhalb Ihres Konstruktors veröffentlicht haben, ist das neu erstellte Objekt trotzdem für die Garbage Collection geeignet - Sie müssen nichts anderes tun. Wenn Sie IDisposable in Ihrer Klasse implementieren, sollten Sie darauf achten, alle Ressourcen freizugeben, die Sie bereits im Konstruktor benötigt haben, aber in meisten -Fällen können Sie die Ausnahme einfach auflösen lassen.

    
Jon Skeet 24.05.2011, 10:48
quelle