Thema: Delphi try ... except

Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: try ... except

  Alt 31. Aug 2009, 01:56
Bitte kein ShowMessage verwenden um Exceptions anzuzeigen.
Solle dies in einer Schleife vorkommen, die >20 Durchläufe hat, dann klickt man sich die Finger wund.
Es ist wirklich eine Unsitte bei Exceptions die Procedure ShowMessage zu verwenden.

Beispiel Webservice: ich will die Exception nicht auf dem Server angezeigt haben,
sondern die Exception muss aufsteigen im Code.
Weit oben sitzt dann ein Exceptionhandler, der die Exception a). mitloggt und b).
eine entsprechende XML/HTML-Seite mit der Meldung aufbereitet und dem Client präsentiert.

Hier ist ein Beispielcode, wie man Exceptions richtig behandelt:
Delphi-Quellcode:
filename := 'C:/Programme/Delphi/test.txt';
sl := TStringList.Create;
try
  try
    sl.loadfromfile(filename);
  except
    on E:Exception do
    begin
      E.Message := Format('Datei <%s> kann nicht geladen werden.'#13#10, [filename])+
        E.Message; // orginale Meldung bleibt erhalten
      raise;
  end;
finally
  sl.Free;
end;
Angenommen, der Benutzer hat kein Zugriff auf die Datei.
Dann bekommt er folgende Meldung präsentiert:
Code:
Datei <C:/Programme/Delphi/test.txt> kann nicht geladen werden.
Zugriff verweigert.
Das ist eine Meldung, mit der man wirklich etwas anfangen kann.
Dagegen wären die Meldungen
Code:
Die Datei ist nicht vorhanden!
oder
Code:
Fehler beim Lesen!
eher falsch bis nutzlos.
Bei einem kleinen Programm ist das nicht so schlimm, aber wenn ein Programm
mit dutzenden Formularen und zig Dateien meldet "Die Datei ist nicht vorhanden!"
dann wird der Benutzer mit Sicherheit seinen Kopf gegen die Wand hauen.


Hier nochmal die goldenen Regeln zum Behandeln von Exceptions:
1.) kein ShowMessage oder irgendetwas, das den Programmablauf aufhält einsetzen
2.) Informations Anreicherung:
wenn ich die Exception nicht selbst behandeln kann, so kann ich zumindest
die Meldung um sinnvolle Information erweitern und dann die Exception aufsteigen lassen.
Beispiel: ich lese eine Datei Zeile für Zeile und interpretiere die Daten.
In der For-Schleife sollte dann ein Exceptionhandler sitzen,
der die Fehlermeldung um "Fehler Verarbeiten der bla-bla Daten. (Zeile %d)" erweitert.
3.) keine Unterdrückung von Information
die orginale Meldung muss immer erhalten bleiben!
4.) wenn ich nichts beitragen kann, dann Finger weg von try..except
5.) leere except..end Blöcke sind (fast) immer ein Hinweis, dass hier etwas unsauber ist
Das Problem liegt dann zwischen try und except.

Das war jetzt fast ein Minitutorial, aber da steckt die Erfahrung von Jahren drin.
Ja und auch ich habe stundenlang meinen Sourcecode durchsucht weil ich ShowMessage innerhalb von except..end verwendet habe.
Jetzt natürlich nicht mehr.
fork me on Github
  Mit Zitat antworten Zitat