G61 hacking sprint
Und wieder mal Ausnahmen

Das Aufräumen der Try/Catch Blöcke ist wie schon erwähnt durch.

An einer Stelle haben wir aber bisher sogar die “Old Style” Fehler-Nicht-Behandlung mittels On Error Resume Next dringelassen: in Dispose() Methoden. Der Grund, dass diese Anweisung dort benutzt wurde, ist, dass in unseren Fenstern viele Controls und Daten lazy - also erst wenn sie wirklich gebracht werden - initialisiert werden. Es ist also beim Schließen eines Fensters recht wahrscheinlich, dass einige Felder nicht initialisiert sind (Nothing in VB.NET). Man müsste also in der Dispose Methode immer einen Test (If foo IsNot Nothing …) um das eigentliche Cleanup herumbauen. Da sieht das On Error Resume Next sehr passend aus: die bei einem nicht initialisierten Feld ausgelöste NullReferenceException wird ignoriert, und die Ressourcenfreigabe läuft weiter.

Aber bekanntlich machen sogar Programmierer mal einen Fehler und in den Dispose-Methoden unseres Programms kommen gelegentlich solche Dinge vor:

    On Error Resume Next
    foo = Nothing
    ...
    ' ganz viel Code hier
    ...
    foo.Dispose()
    foo = Nothing

Möglicherweise war Anfangs nur das erste foo = Nothing drin, und als später erkannt wurde, dass foo disposed werden muss, wurde die erste Anweisung übersehen, und die zweite Freigabe eingebaut. Die natürlich immer eine Ausnahme auslöst, die dank des On Error ignoriert wird. Die Ressourcen von foo werden also nicht freigegeben.

Da ich inzwischen einige solcher Stellen gefunden habe, bleibt uns nichts anderes übrig, als die On Error ... Statements auch aus den Dispose-Methoden zu entfernen. Weniges ist beim Kunden unangenehmer zu debuggen, als Ressource-Lecks.

Blog comments powered by Disqus