Hier steht was zu
Abort
Damit wird klar, warum das list.free nicht aufgerufen wird.
Delphi-Quellcode:
try
Funktion_die_im_Fehlerfalle_Abort_aufruft;
except
on e : EAbort
do begin
ShowMessage('
Abort wurde aufgerufen.');
end;
on e :
Exception do begin
MessageDLG(e.
Message,mtError,[mbok],0);
end;
end;
Abort ist letztlich auch nur 'ne
Exception, deren Meldung "verschluckt" wird. Man kann sie aber im Exceptionhandling "abfangen" und damit auch in dem Fall ein "vernünftiges" Weiterlaufen des Programmes sicherstellen.
Mal ein annähernd sinnfreies Beispiel zum rumprobieren:
Delphi-Quellcode:
function Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i : Integer) : Integer;
begin
Result := 4812;
if i < 0
then begin // Als Fehlerfall ist hier einfach mal i < 0 definiert.
Abort;
end else begin
Result := Result
div i;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
list : TStringList;
k : Integer;
i : Integer;
begin
list := TStringList.Create;
list.Add('
irgendwas');
list.Add('
nochwas');
i := 47;
k := 12;
try
try
// Wahlweise mit i = 0, i = -1 und i = 1 ausprobieren
// und die Reihenfolge der Wertzuweisung zu i mal ändern.
i := 1;
k := Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i);
i := -1;
k := Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i);
i := 0;
k := Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i);
except
on e : EAbort
do begin
MessageDlg(e.
Message,mtError,[mbOk],0);
end;
on e :
Exception do begin
MessageDlg(e.
Message,mtError,[mbOk],0);
end;
end;
ShowMessage(Format('
i = %d, k = %d',[i,k]));
finally
list.Free;
end;
end;