Initialisieren muß man Variablen (vorallem die Lokalen) nur, wenn man sie auswerten will/muß, bevor etws zugewiesen werden konnte.
Grundsätzlich:
* Alle Variablen müssen
vor dem Try initialisiert werden (gilt vorallem für lokale Variablen)
* maximal 1 Create dürfte vor das Try (wenn es da schon knallt wird Nachfolgendes nicht ausgeführt)
* im Free kann man nur etwas zusammenfassen, wenn es dort keine Fehler geben kann, bzw. maximal beim letzten Befehl da drin
Also ob sich mehrere Try-Finally verbinden lassen, hängt eigentlich vom Finally ab, aber man kann Try-Finally auch da unten verschachteln.
Zitat:
Delphi-Quellcode:
procedure foo;
var
sl1, sl2: TStringList;
begin
sl2:= nil;
try
sl1:= TStringList.Create();
sl2:= TStringList.Create();
...
finally
sl2.Free();
sl1.Free();
end;
end;
sl1 wurde nicht initialisiert und es knallt im finally, wenn es schon beim
sl1:= TStringList.Create();
Probleme gibt.
Delphi-Quellcode:
sl1 := nil;
sl2 := nil;
try
sl1 := TStringList.Create;
sl2 := TStringList.Create;
...
finally
sl2.Free;
sl1.Free;
end;
Delphi-Quellcode:
sl1 := TStringList.Create;
try
sl2 := TStringList.Create;
...
finally
sl2.Free;
sl1.Free;
end;
Delphi-Quellcode:
sl1 := TStringList.Create;
try
sl2 := TStringList.Create;
...
finally
try
sl2.Free;
finally
sl1.Free;
end;
end;
Delphi-Quellcode:
sl1 := TStringList.Create;
try
sl2 := TStringList.Create;
try
...
finally
sl2.Free;
end;
finally
sl1.Free;
end;
Letztendlich bassiert alles auf den oben genannten Punkten.
Also wenn die zutreffen, dann isses OK.
Selbst das wäre "richtig"
Delphi-Quellcode:
sl1 := TStringList.Create;
try
sl2 := TStringList.Create;
except
sl1.Free
end;
try
...
finally
try
sl2.Free;
finally
sl1.Free;
end;
end;
// oder
sl1 := nil;
try
sl1 := TStringList.Create;
sl2 := TStringList.Create;
except
sl1.Free
end;
try
...
finally
try
sl2.Free;
finally
sl1.Free;
end;
end;
z.B. bei einer TStringList geh ich grundsätzlich davon aus, daß das Freigeben immer funktioniert (so lange der Zeiger gültig ist)
und demnach kann ich da auch mehrere Free zusammen in ein Finally schreiben.
Sollte es dort dennoch knallen, dann ist perse das Programm nicht mehr lauffähig und eine bessere Fehlerbehandlung ist eh nicht mehr nötig. (z.B. nach einem Buffer-Overrun)