freedy hat folgendes geschrieben : |
kennt ihr eine Möglichkeit den Konstruktor zu unterbrechen und eine Instanz nicht anzulegen, wenn beim Anlegen ein Fehler aufgetreten ist?
Ich habe probiert mit Raise eine Exception aufzurufen. Das gibt aber am Programmende nur Probleme mit nicht freigegebenen Speicher.
|
Wenn man im Konstruktor eine Exception ausloest, so wird automatisch der zugehoerige Destruktor aufgerufen. Dh. der Destruktor muss damit klarkommen, dass evtl. das Objekt nur teilweise erzeugt ist. Das ist in der Regel kein Problem, weil alle Felder mit 0 / NIL / Leerstring initialisiert werden, also folgendes einfach nur funktioniert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| constructor TMyObject.Create; begin inherited Create; raise Exception.Create('Test'); FMyList := TList.Create; end;
destructor TMyObject.Destroy; begin FMyList.Free; inherited; end; |
Da FMyList mit NIL initialisiert wird, kann man im Destruktor einfach FMyList.Free (oder alternativ FreeAndNil(FMyList)) aufrufen, da die Methode Free ueberprueft, ob SELF <> NIL ist.
Der langen Rede kurzer Sinn: Exceptions sind durchaus dazu geeignet, die Erzeugung eines Objekts im Konstruktor zu verhindern. Bei korrekten Destruktoren sollte es dabei auch keine Speicherlecks geben.
twm