Re: Debuggen von Critical Sections



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
.



Relevant Pages

  • =?iso-8859-1?Q?Re:_Datareader_schlie=DFen?=
    ... Wenn dieses, oder einige folgende Dinge, die auch im Try-Block sind nicht gelingt, springe ich in den Catch - Block. ... In Finally wird der dr geschlossen: ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)
  • Datareader =?ISO-8859-1?Q?schlie=DFen?=
    ... Wenn dieses, oder einige folgende Dinge, die auch im Try-Block sind nicht gelingt, springe ich in den Catch - Block. ... In Finally wird der dr geschlossen: ... If Not dr.IsClosed Then dr.Close ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)