![]() |
Fehler in eigenen Komponenten "behandeln"
Hallo zusammen :thumb:
Wie der Titel schon sagt stellt sich mir die Frage nach dem best practice für die Behandlung von Fehlern wie z.B. Ungültige Parameter in Funktionen und Prozeduren in selbst geschriebenen Komponenten. Ein Beispiel: in meiner Komponente gibt es eine Prozedur
Delphi-Quellcode:
Es geht hier beispielhaft um den Parameter UserID, welcher größer 0 sein muss. Dies möchte ich bei einer falschen Übergabe z.B. -1 (da intern für eigene Zwecke reserviert) dem User mitteilen. Mir kommen folgende Möglichkeiten und ich wollte fragen wie ihr das lösen würdet:
Procedure SendText(const UserID : Integer; Text : String);
1.) MessageDlg Vorteil: Kontrolle an Ort und Stelle in der entsprechenden Funktion der Komponente Nachteil: der Programmfluss wird gestört und der User kann in seinem Programm nicht selbst reagieren 2. "Error-Event" mit Übergabe der "Fehlernummer" Vorteil: Volle Kontrolle der Reaktion durch den Benutzer Nachteil: völlig unabhängige Fehler werden in einer einzigen Routine behandelt was IMHO sehr unübersichtlich werden könnte. Sowohl intern in der Komponente als auch im eigentlichen Programm 3. Exception-Handling Sehr wenig Erfahrung ehrlich gesagt, da ich in meinen Programmen dies bisher immer zuverlässig selbst durch Prüfung der Eingaben etc. abgefangen habe, so dass die Funktion des Programmes ohne "falsche" Eingabe gar nicht erst aufgerufen wurde. Das Exception-Handling wirkt auf mich immer so "hart" wenn Fehler auftreten. Sollte dies nicht schon durch Plausibilitätsprüfungen der Eingaben etc. abgefangen werden? Wie löst ihr solche Probleme oder welche Methode würdet ihr wählen? Beste weihnachtliche Grüße, Michael |
AW: Fehler in eigenen Komponenten "behandeln"
Delphi-Quellcode:
function SendText(const UserID : Integer; Text : String) : Boolean;
Fehlerprüfung in die Funktion. Alles ok, dann Rückgabewert = true sonst Rückgabewert = false; Im Programm muss man dann halt den Rückgabewert der Funktion auswerten und entsprechend reagieren. Grob in etwa so:
Delphi-Quellcode:
function SendText(const UserID : Integer; Text: String) : Boolean;
begin Result := UserID > 0; try if Result then begin // Machen, was zu tun ist ... end else begin // Wenn hier was zu retten sein sollte ... end; except on e : Exception do begin Result := false; // und weitere Fehlerbehandlung. // ggfls. Raise ... end; end; end; |
AW: Fehler in eigenen Komponenten "behandeln"
Hallo,
Punkt 2 oder 3. Bei den Exceptions hast du den Vorteil, dass du eigene Exception-Klassen mit verschiedenem Funktionsumfang (Daten=Inhalt) erzeugen kannst. < Sollte dies nicht schon durch Plausibilitätsprüfungen der Eingaben etc. abgefangen werden? > Nein. Wenn der Nutzer z.B. nicht weiss, dass dein UserId>0 sein soll, sollte doch zumindestens die Komponente eine aussagekräftige Fehlermeldung erzeugen. |
AW: Fehler in eigenen Komponenten "behandeln"
Danke für die Antwort. Prinzipiell eine gute Idee und bei anderen Funktionen auch so angewendet. Allerdings gibt es hier mehrere Fehlermöglichkeiten die berücksichtigt werden müssen - also scheidet ein true/false aus.
- UserID < 0 - User-ID existiert nicht - User mit UserID nicht online [...] Und warum hier ein try...except-Block (keine Kritik sondern ich möchte es verstehen :) )??? |
AW: Fehler in eigenen Komponenten "behandeln"
Danke auch an hoika,
Wie gesagt habe ich mit Exceptions relativ "wenig" Erfahrung. Auf jeden Fall werde ich mich nochmals belesen :) |
AW: Fehler in eigenen Komponenten "behandeln"
Zitat:
Try Except gibt es bei mir immer, wenn ich nicht absolut ausschließen kann, dass irgendwas passiert, womit ich nicht rechne. Try finally immer, wenn es sonst passieren könnte, dass irgendwas nicht freigegeben wird. Ok: Konkret mehr als True bzw. False. Funktion bekommt noch 'nen weiteren var-Parameter, in den Du die Fehlermeldung schreibst. Ist der Rückgabewert false, muss der Programmierer, der die Funktion nutzt, diesen auswerten und entsprechend reagieren. Oder wie hoika schreibt: Eigene Exception definieren. Ohne Garantie für irgendwas (nur hingedaddelt):
Delphi-Quellcode:
type
EUserIDKleiner0 = class(Exception); EUserIDExistiertNicht = class(Exception); EUserIDNichtOnline = class(Exception); EUserIDSonstigerFehler = class(Exception); ... function SendText(const UserID : Integer; Text: String) : Boolean; begin Result := false; if UserID < 0 then begin raise EUserIDKleiner0.CreateFmt('Die Userid %d ist kleiner als 0.',[UserID]); end else if not UserIDExists(UserID) then begin raise EUserIDExistiertNicht.CreateFmt('Die UserID %d existiert nicht.',[UserID]); end else if not UserIDIstOnline(UserID) then begin EUserIDNichtOnline.CreateFmt('User mit UserID %d ist nicht online.',[UserID]); end else begin try // Machen, was zu tun ist ... Result := True; except on e : Exception do begin // und weitere Fehlerbehandlung. // ggfls. Raise ... Raise EUserIDSonstigerFehler.CreateFmt('%s zu UserID %d',[e.Message,UserID]); end; end; end; ... // irgendwelcher Quelltext, der die Funktion nutzt. begin try if SendText(47, 'Text') then begin // Erfolgsmeldung ... end else begin // Fehler, der nicht explizit in der Funktion behandelt wurde... end; except on e : EUserIDKleiner0 do begin // Einfachstes MessageDlg(e.Message,mtError,[mbOk],0); // Oder beliebige andere Fehlerbehandlung. end; on e : EUserIDExistiertNicht do begin ... end; on e : EUserIDNichtOnline do begin ... end; on e : EUserIDSonstigerFehler do begin ... end; on e : Exception do begin MessageDlg(e.Message,mtError,[mbOk],0); end; end; end; |
AW: Fehler in eigenen Komponenten "behandeln"
Zitat:
Wer ist denn der User? Der Enduser oder der Programmierer als Nutzer Deiner Komponenten? Wenn der Enduser gemeint ist und er die ID selbst irgendwie eingibt fiele die Prüfung m.E. unter eine Validierung. Insofern könnte das Edit rot umrahmt werden o.ä. und eine Speicherung des Datensatzes verweigert werden. Wenn der Programmierer gemeint ist wären Exceptions sicherlich i.O. |
AW: Fehler in eigenen Komponenten "behandeln"
Super - jetzt habe ich es einigermaßen verstanden :)
Besonders komplex ist die Komponente nicht, aber gerade da könnte man ja anfangen neues wie z.B. Exception-Klassen zu lernen :) Ich habe es jetzt mittels Event und der besagten "var-Variable" gelöst. Funktioniert prima. Mit UserID ist übrigens der Enduser z.B. beim Chat oder wie auch immer zur Identifizierung gemeint und nicht der Programmierer. Besten Dank für Eure Hilfe die, wie immer, erstklassig ist! Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz