Re: Debuggen von Critical Sections
- From: Hans-Peter Diettrich <DrDiettrich1@xxxxxxx>
- Date: Mon, 14 May 2007 14:22:36 +0200
Matthias Hanft wrote:
Dagegen müßte das _dann_ funktionieren, wenn man an der Stelle (* 1 *)
explizit myFileStream:=nil; hinschreibt - richtig?
So mache ich das auch ;-)
Macht "man" das so? Also Lösung 1:
procedure TuWas;
var
myFileStream: TFileStream;
begin
myFileStream:=nil; // damit "Free" in "finally" funktioniert
try
myFileStream:=TFileStream.Create(...);
// tu was mit myFileStream
finally
myFileStream.Free // geht jetzt immer und überall
end
end;
Normalerweise macht "man" das nicht so, sondern setzt das try-finally *hinter* Create. Damit wird eine Initialisierung der lokalen Variablen überflüssig, weil bei einem Fehler im Konstruktor der Try-Block überhaupt nicht betreten wird, und damit das Free in Finally nicht aufgerufen werden kann.
Aber wie gesagt, die Initialisierung aller Objekt-Variablen mit Nil hat deutliche Vorteile, denn dann kann man auch mehrere Objekte innerhalb des Try-Blocks erzeugen, und im Finally wieder freigeben. Im Falle einer Exception wird dann zwar alles im Finally ausgeführt, aber Free überspringt selbständig alle Objekte, die Nil sind. In der Standard-Lösung müßte man stattdessen für jedes Objekt einen eigenen Try-Finally Block einführen.
im Gegensatz zu - der von mir bisher verwendeten - Lösung 2:
procedure TuWas;
var
myFileStream: TFileStream;
begin
try
myFileStream:=TFileStream.Create(...);
try
// tu was mit myFileStream
finally
myFileStream.Free // hier ist er ja _immer_ offen
end
except
// irgendeine Fehlerbehandlung für "Datei nicht zu öffnen"
end
end;
Mit meiner Lösung habe ich halt gleich die Fehlerbehandlung für
"Datei nicht zu öffnen" eingebaut - bei Lösung 1 müßte man da
wohl irgendwo noch ein "if Assigned(myFileStream)" dafür ein-
bauen oder so...
Perfekt! :-)
try-finally und try-except sind immer getrennte Blöcke, beides zusammen in einem Block geht nicht, macht bei genauerer Betrachtung auch keinen Sinn.
Bleib also dabei, alle Objekt-Variablen erst mal zu Nilen, dann kannst Du alle Creates auch in den Try-Finally Block hineinpacken.
DoDi
.
- References:
- Debuggen von Critical Sections
- From: Matthias Hanft
- Re: Debuggen von Critical Sections
- From: Andreas Koch
- Re: Debuggen von Critical Sections
- From: Matthias Hanft
- Re: Debuggen von Critical Sections
- From: Hans-Peter Diettrich
- Re: Debuggen von Critical Sections
- From: Matthias Hanft
- Re: Debuggen von Critical Sections
- From: Heinz Zastrau
- Re: Debuggen von Critical Sections
- From: Matthias Hanft
- Debuggen von Critical Sections
- Prev by Date: Re: Debuggen von Critical Sections
- Next by Date: Re: Debuggen von Critical Sections
- Previous by thread: Re: Debuggen von Critical Sections
- Next by thread: Re: Debuggen von Critical Sections
- Index(es):
Relevant Pages
|