AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler in eigenen Komponenten "behandeln"

Ein Thema von scrat1979 · begonnen am 20. Dez 2016 · letzter Beitrag vom 22. Dez 2016
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

Fehler in eigenen Komponenten "behandeln"

  Alt 20. Dez 2016, 22:06
Hallo zusammen

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

Procedure SendText(const UserID : Integer; Text : String); 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:

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
Michael Kübler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Fehler in eigenen Komponenten "behandeln"

  Alt 20. Dez 2016, 22:17
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;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Fehler in eigenen Komponenten "behandeln"

  Alt 20. Dez 2016, 22:19
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.
Heiko

Geändert von hoika (20. Dez 2016 um 22:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Fehler in eigenen Komponenten "behandeln"

  Alt 20. Dez 2016, 22:24
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 )???
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Fehler in eigenen Komponenten "behandeln"

  Alt 20. Dez 2016, 22:27
Danke auch an hoika,

Wie gesagt habe ich mit Exceptions relativ "wenig" Erfahrung. Auf jeden Fall werde ich mich nochmals belesen
Michael Kübler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Fehler in eigenen Komponenten "behandeln"

  Alt 20. Dez 2016, 23:04
Und warum hier ein try...except-Block (keine Kritik sondern ich möchte es verstehen )???
Naja, habe hat keine Ahnung wie komplex Dein konkretes Problem ist, daher mal prophylaktisch mit eingebaut.

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;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Fehler in eigenen Komponenten "behandeln"

  Alt 21. Dez 2016, 12:21
Procedure SendText(const UserID : Integer; Text : String); 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.

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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Fehler in eigenen Komponenten "behandeln"

  Alt 22. Dez 2016, 14:09
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
Michael Kübler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz