wie handhabt ihr das Exception-Handling und Freigeben mehrer Objekte?
Ich habe folgendes Beispiel, so wie ich es machen würde:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
SL1, SL2: TStringList;
begin
// SIGSEGV-Fehler verhindern, außerdem gibt es somit keine "herumirrenden" Objekt-Pointer
SL1 := nil;
SL2 := nil;
try
try
SL1 := TStringList.Create;
SL2 := TStringList.Create;
SL1.AddText('Das ist ein Text, der einer Stringlist hinzugefügt wurde!');
SL2.AddText('Das ist ein weiterer Text, der einer Stringlist hinzugefügt wurde!');
finally
// Bei FreeAndNil (strengenommen eher NilAndFree) kann laut Dokumentaion ein Fehler auftreten, deswegen manuell.
// Außerdem keine "herumirrenden" Pointer von Objekten, die auf eine ungültige Adresse zeigen.
SL1.Free;
SL1 := nil;
SL2.Free;
SL2 := nil;
end;
except
on E: Exception do
begin
ShowMessageFmt('Exception:' + #13#10 + '%s - %s', [E.QualifiedClassName, E.Message]);
Exit; // sinnvoll?
end;
end;
// weiterer Code (...)
end;
Mitunter als Anlaufpunkt dienten folgendende Artikel:
Try-Finally Blocks for Protecting Multiple Resources in Delphi: https://blog.marcocantu.com/blog/2018-j ... elphi.html
[SOLVED] Handling Exception: https://forum.lazarus.freepascal.org/in ... ic=24690.0
Dann noch ein paar Fragen, die ich mir gestellt habe:
1. Ist es sinnvoll, erst die Objekte freizugeben und dann auf die Exception zu reagieren oder doch lieber umgekehrt?
2. Sollte nach der Exception der Code weiterlaufen oder lieber mit einem Exit die Prozedur beendet werden?
Bin gespannt auf eure Ideen und Vorschläge.
Grüße
Dee