Thema: FreePascal Try Except Problem

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Try Except Problem

  Alt 1. Feb 2015, 11:57
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 ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 1. Feb 2015 um 12:01 Uhr)
  Mit Zitat antworten Zitat