Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#6

AW: Fehler in eigenen Komponenten "behandeln"

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