Zitat von
angos:
So herum ist es richtig.
Wieso sollte? Wer sagt dir das?
Ich kann
Exception des gesamten Blockes auch noch später abfangen, also warum sollte es nun richtig sein den Except Block innerhalb des Finallys zu haben? Bitte gebe mir mindestens eine schlüssige Begründung dazu.
Und wo wir gerade dabei sind an alle Leser nochmal ein Hinweis über einen gerne gemacht Fehler in diesem Zusammenhang:
Delphi-Quellcode:
var
lFile: TNativeXML;
begin
try
lFile := TNativeXml.CreateName('xyz');
[...]
finally
FreeAndNil(lFile);
end;
end;
In dieser Konstellation gibt Delphi keine Warnung aus, dass die Variable lFile möglicherweise nicht initialisiert worden ist.
Delphi-Quellcode:
var
lFile: TNativeXML;
begin
try
lFile := TNativeXml.CreateName('xyz');
[...]
finally
lFile.Free;
end;
end;
So rum schon.
Der Fehler das Create in das try zu schieben wird oft und gerne gemacht. Auch ist die Frage der Anwendung des FreeAndNil() auf eine lokale Variable fraglich, aber FreeAndNil() ist besser und sicherer - steht an vielen Ecken. Damit wird es oftmals auch sehr oft eingesetzt. Im zweiten Falle kommt die Warnung von Delphi und es fällt auf, dass der Constructor Aufruf innerhalb des try/finally steht. Wenn aber nun FreeAndNil() verwendet wird, dann nicht. Hintergrund ist einfach nur, dass FreeAndNil() einen var Parameter und damit kann der Compiler dies nicht mehr erkennen, da die Funktion die Variable innerhalb ihrer belegen kann.
FYI