Was ist daran in welcher Hinsicht besser? Immerhin müßte ich, um deinen Vorschlag umzusetzen, eine zusätzliche
Unit einbinden.
Exception fängt jedoch den Fehler einwandfrei ab, das genügt mir.
Problematisch ist daran, dass du eben egal welche
Exception fängst und durch den großen Einzugsbereich von
try .. except
eben auch für alles Möglich eine
Exception bekommen kannst.
Wenn du programmtechnisch alles richtig machst, dann wird diese Lösung exakt das machen, was du davon erwartest. Somit also keine Einwände.
Die Probleme fangen immer dann an, wenn es aus welchen Gründen auch immer in dem gekennzeichneten Bereich zu einer
Exception kommt:
Delphi-Quellcode:
Try
{problematischer Bereich Anfang}
DatMod.Qset_Personen.Append;
Feld_Id.AsInteger := Id;
Feld_Name.AsString := Person;
If DateExists Then
Feld_Datum.AsDateTime := Datum;
{problematischer Bereich Ende}
DatMod.Qset_Personen.Post;
Result := True;
Except
dann reagierst du so, als ob es sich um ein Duplikat handelt.
Besser wäre es zumindestens schon mal das so umzustellen
Delphi-Quellcode:
Function TFrame_PersonenAktuell.Eintragen(Id : Integer; Person :
String; Datum : TDateTime; DateExists : Boolean) : Boolean;
begin
DatMod.Qset_Personen.Append;
Feld_Id.AsInteger := Id;
Feld_Name.AsString := Person;
If DateExists
Then
Feld_Datum.AsDateTime := Datum;
Try
// Nur Post-Methode abfangen
DatMod.Qset_Personen.Post;
Result := True;
Except
// Eine Einschränkung auf den konkreten Exception-Typ wäre noch besser
On E:
Exception Do
Begin
Result := False;
// Das ist die Lösung: das Dataset ist noch im Insert-Mode, wenn ich es beim nächsten Mal anspreche
If (DatMod.Qset_Personen.State = dsInsert)
Or
(DatMod.Qset_Personen.State = dsEdit)
Then
DatMod.Qset_Personen.Cancel;
Memo_Log.Lines.Append(e.
Message + GLD.TS + IntToStr(Id));
End;
End;
end;