Der
falsche Umgang mit Exceptions (ich bezeichne das gerne als eine lethale
Exception-Phobie) führt zu den interessantesten Problemen, die nur durch aufwändigstes Debugging zu beheben sind:
Delphi-Quellcode:
function TForm1.LoadFromFile( const AFilename : string ) : Boolean;
begin
try
Memo1.LoadFromFile( AFilename );
Result := True;
except
Result := False;
end;
end;
Sieht doch schick aus und wir werden
niemals eine
Exception sehen - GottSeiDank!
Delphi-Quellcode:
procedure TForm1.LoadFileButtonClick(Sender : TObject );
begin
if OpenDialog1.Execute then
begin
if LoadFromFile( OpenDialog1.Filename ) then
Edit1.Text := OpenDialog1.Filename
else
ShowMessage( 'Datei nicht gefunden ' + OpenDialog1.Filename );
end;
end;
Ei, was haben wir uns da eine schöne robuste KeineExceptionWerfende Funktionalität gebaut (stundenlang-auf-die-schultergeklopfe).
Irgendeine Knalltüte (in 99% der Fälle, ist man das sogar selber) hat uns aber irgendwo in den Code folgende Zeile eingebaut:
Delphi-Quellcode:
procedure TForm1.SomethingSpecial;
begin
// mehrere Zeilen Code
Memo1 := nil;
// noch mehr Zeilen Code
end;
Jetzt wird
keine Datei mehr geladen
selbst wenn es die Datei gibt und die Anwendung behauptet in der Meldung steif und fest, dass es diese Datei nicht gibt. Ich wünsche eine fröhliche Fehlersuche, wenn der Anwender mitteilt, dass keine Datei mehr geladen wird. Natürlich behaupten wir - wegen unsere unfehlbaren Methode - dass es diese Datei dann eben auch nicht gibt. Und wir testen das Laden bis zum Erbrechen und werden keinen Fehler finden und natürlich den Anweder einfach als DAU abstempeln.
Woher sollen wir denn wissen, dass dieses Verhalten nur dann auftaucht, wenn man vorher diese oder jene Funktion ausgeführt hat, die eben dieses
Memo1 := nil;
ausführt?
Ja, woher soll man das wissen?
Und was ist damit?
Delphi-Quellcode:
procedure TForm1.LoadFromFile( const AFilename : string );
begin
Memo1.LoadFromFile( AFilename );
end;
procedure TForm1.LoadFileButtonClick(Sender : TObject );
begin
if OpenDialog1.Execute then
begin
LoadFromFile( OpenDialog1.Filename );
Edit1.Text := OpenDialog1.Filename;
end;
end;
Keine Datei gefunden -> Fehlerdialog mit EFileNotFound erscheint, Edit1 bleibt unverändert
Memo1 ist nil -> Fehlerdialog mit EAccessViolation erscheint, Edit1 bleibt unverändert
Suchst du noch oder hast du den Fehler schon behoben ...
bzw.
Diskutierst du noch mit dem Anwender oder suchst du schon den Fehler ...