Code: Alles auswählen
TCPx = class
TCPxHnd := TCPx.Create;
Ist klar, aber kann es beim Create nicht auch schon zu Fehlern kommen?
Setzt man das dann in 2 Blöcke oder wie macht man das ?
Code: Alles auswählen
TCPx = class
TCPxHnd := TCPx.Create;
Code: Alles auswählen
TCPxHnd := TCPx.Create;
try
...
finally
TCPxHnd.free(); //oder destroy() weil TCPxHnd hier sicher nicht nil ist
end;
Code: Alles auswählen
var
MyObject: TObject = nil;
begin
try
MyObject := TObject.Create;
[...]
finally
FreeAndNil(MyObject);
end;
end;
Das wäre dann doppelt gemoppelt.m.fuchs hat geschrieben:Pack das Create doch in den Try-Block:
If an exception is raised during the execution of a constructor that was invoked on a class reference, the Destroy destructor is automatically called to destroy the unfinished object.
Was ist wenn der Create fehlschlägt, deswegen die Frage ob man das dann sinnvollerweise in 2 Blöcke verschachtelt?Philos hat geschrieben:Mein Gedanke ist folgender: ( bitte um Berichtigung, falls ich mich da täuschen sollte)
Wenn beim Create schon etwas schiefgeht, dann habe ich kein wirkliches Objekt erhalten an der Stelle oder nur irgendwas Undefiniertes, auf das ich zugreifen kann. Wenn wir dann bei einem Error gleich ins
Except oder Finally springen, versucht Free ETWAS zu löschen an der angeblichen Adresse von unserer Instanz, die ja nun aber alles mögliche sein kann (da wir ja annahmen, dass Create nicht geklappt hat ). Ich könnte mir vorstellen, dass dies einige ungewünschte Effekte haben könnte.
http://www.delphi-treff.de/tipps-tricks ... -abfangen/obj := TObj.Create;
try
obj.DoSomething;
finally
obj.Free;
end;
Zuerst wird das Objekt erstellt – aber Achtung: dies darf nicht im try-Block geschehen! Tritt nämlich beim Erstellen des Objekts ein Fehler auf, wird das Objekt nicht erstellt und darf somit auch nicht freigegeben werden, was ansonsten im finally-Block geschehen würde. Da sich dieser Befehl aber außerhalb des try-Blocks befindet, wird der finally-Block bei einem Laufzeitfehler im Konstruktor nie ausgeführt.Dann wird im try-Block eine Methode des Objekts aufgerufen und am Ende wird es wieder freigegeben. Auch wenn die aufgerufene Methode fehlschlägt, wird das Objekt freigegeben.Im Allgemeinen ist es guter Programmierstil, nach einer Instanzierung von einem Objekt immer ein try…finally…end Konstrukt einzusetzen – egal wie fehlersicher die nachfolgenden Aufrufe sind.
Code: Alles auswählen
obj := TObj.Create;
try
obj.DoSomething;
finally
obj.Free;
end;
Code: Alles auswählen
obj := TObj.Create;
try
obj.DoSomething;
finally
obj.FreeAndNil;
end;
Code: Alles auswählen
try
obj := TObj.Create;
try
obj.DoSomething;
finally
obj.Free;
end;
except
// error log
end;
Code: Alles auswählen
obj := TObj.Create;
try
try
obj.DoSomething;
finally
obj.Free;
end;
except
// error log
end;