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.
Echt jetzt? Für was könnte ich denn noch eine
Exception bekommen?
Wenn du programmtechnisch alles richtig machst, dann wird diese Lösung exakt das machen, was du davon erwartest. Somit also keine Einwände.
Das nennt man eine Tautologie: Wenn ich dich mit Wasser begieße, bist du naß. Wenn ich alles richtig mache, gibt's keine Fehler. Ei sowas aber auch, da wäre ich in hundert Jahren nicht draufgekommen
Die Probleme fangen immer dann an, wenn es aus welchen Gründen auch immer in dem gekennzeichneten Bereich zu einer
Exception kommt:
Äh – welche Probleme? Wenn es von Append bis Post bzw. Cancel zu einer
Exception kommt, wird der Name nicht eingetragen und stattdessen in die Textdatei geschrieben mit einem Hinweis auf den Grund, weshalb das nicht eingetragen wurde. Wo ist denn da das Problem?
Inzwischen gibt es nicht mal mehr Doubles, die in die Textdatei geschrieben werden müssen, denn ich frage nun vor dem Append ab, ob der Name bereits eingetragen ist:
Delphi-Quellcode:
Function TAktual.Eintragen_Person(Id: Integer; Person: String; Datum: TDateTime; DateExists: Boolean): Boolean;
Var
Z : Integer;
Aus : String;
begin
Z := 0;
Aus := Person;
While DatMod.PersonExists(Aus) Do
Begin
Inc(Z);
Aus := Person + ' (' + IntToStr(Z) + ')';
End;
Person := Aus;
Try
...
Ich kann erst später nachschauen/entscheiden/recherchieren, ob der doppelte Name dieselbe Person bezeichnet oder eben eine andere mit demselben Namen. Die Gründe hierfür zu erklären würde jetzt aber zu weit führen. Ich sehe hier nicht wirklich ein Problem, nicht mal im Ansatz. Und selbstverständlich verwende ich in anderen Fällen schon die passenden Exceptions, z.B. beim Umgang mit IdHttp:
Delphi-Quellcode:
Function TAktual.Anfrage(Var Aurl: String) : Boolean;
begin
Try
AUrl := IdHt.Get(Aurl);
Result := True;
Except
on E: EIdHTTPProtocolException Do
Begin
Result := False;
Aurl := Aurl + GLD.TS + IntToStr(e.ErrorCode);
End;
End;
end;
Da wird dann später anhand des Errorcodes auf den Fehler reagiert, einstweilen wird er in der aufrufenden Methode protokolliert, weshalb Aurl ein Var ist (und GLD.TS ein Trenner mit Space: ' | '). Was wäre da jetzt z.B. anders, wenn ich statt EIdHTTPProtocolException einfach
Exception schreiben würde? Würde sich das Programm auch nur ein klein wenig oder sogar spürbar anders verhalten? Ich glaube kaum ...
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;
Also mal ehrlich, lieber Sir Rufo, wieso soll denn das Dataset nach Auftreten eines Fehlers, der ja einzig und allein ein Fehler beim Post sein kann, nicht im Insert-Status sein? Eine andere Möglichkeit gibt es hier doch gar nicht mehr. Bei meiner Version können zumindest noch das Append und die Wertzuweisungen (theoretisch) Exceptions auslösen, weshalb die Abfrage des Status mehr oder weniger gerechtfertigt ist. Aber hier? Du schreibs doch selber im Kommentar: Nur Post-Methode abfangen. Was für einen Status also kann ein Dataset nach einem mißlungenen Post überhaupt haben? Richtig: dsInsert oder dsEdit. Denn wäre bereits das Append schiefgelaufen – wäre ja theoretisch möglich, weil z.B. die Verbindung zur
DB nicht mehr besteht –, wäre das Programm mit einer Fehlermeldung abgestürzt. Bei mir würde es aber nicht abstürzen. Also Sachen rätst du mir, da bleib ich doch lieber bei meiner Vorgehensweise, wenn du gestattest, vielen Dank.