Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   FreePascal Try Except Problem (https://www.delphipraxis.net/183732-try-except-problem.html)

p80286 1. Feb 2015 10:08

AW: Try Except Problem
 
Zitat:

Zitat von Sir Rufo (Beitrag 1288440)
Wie geht man mit Exceptions um?

Wenn man die behandeln kann, dann und nur dann nimmt man einen
Delphi-Quellcode:
try except
. Ansonsten macht man sich das Verhalten einer Exception zunutze (alle Anweisungen danach werden nicht mehr ausgeführt)

Danke, daß Du das mal so klar ausgeführt hast. Meist finde ich nur Beschreibungen wie man mit Exceptions umgeht, aber nicht warum. Das muß sich der geneigte Benutzer oftmals selbst erarbeiten, und die Überprüfung der eigenen Erkenntnisse scheitert an wolkigen Aussagen, die mehr verschleiern als erklären.

Gruß
K-H

Sir Rufo 1. Feb 2015 10:57

AW: Try Except Problem
 
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
Delphi-Quellcode:
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 ...

himitsu 1. Feb 2015 11:13

AW: Try Except Problem
 
Zitat:

Zitat von Sir Rufo (Beitrag 1288445)
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!

Noch "besser" ist nur :wall:
Delphi-Quellcode:
procedure TForm1.LoadFromFile( const AFilename : string );
begin
  try
    Memo1.LoadFromFile( AFilename );
  except
  end;
end;
und noch beliebter ist Code ala
Delphi-Quellcode:
try
  i := StrToInt('abc');
except
  i := 0;
end;

Sir Rufo 1. Feb 2015 11:16

AW: Try Except Problem
 
@himitsu

Bei so einem Code sollte einem eigentlich augenblicklich die Gicht in die Finger fahren. Mal sehen ob sich das mit einer IDE-Erweiterung realisieren lässt :mrgreen:

jaenicke 1. Feb 2015 16:26

AW: Try Except Problem
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1288437)
Mit Booleval wird aber auf jedenfall die LoadFile-Methode ausgeführt

Nein, denn ich habe die vollständige Auswertung ja aus- und nicht angeschaltet. ;-)

himitsu 1. Feb 2015 16:39

AW: Try Except Problem
 
Das sollte sowieso standardmäßig aus sein und auch besser aus bleiben.

jaenicke 1. Feb 2015 18:24

AW: Try Except Problem
 
Naja, eher sollte diese Einstellung vor Code, die sich auf die eine oder andere Richtung darauf verlässt, grundsätzlich gesetzt werden. ;-)

Dejan Vu 1. Feb 2015 22:15

AW: Try Except Problem
 
Ich würde mich bei Delphi gar nicht darauf verlassen. Sonst kommt irgendein Waldschrat mal auf die Idee, das anzuschalten und dann wundert man sich doch etwas.

Ich habe mich bei Delphi jedenfalls nie darauf verlassen.

himitsu 1. Feb 2015 22:37

AW: Try Except Problem
 
Ich hab es aufgegeben alle "Standards" selber nochmal zu setzen.

Wenn irgendein Idiot daran rumspielt, dann hat er Pech und muß mit den Konsequenzen leben.
Ich bin auch dafür, daß solche Optionen endlich mal aus den Projektoptionen raus fliegen oder es zumindestens mit mindestens 200 "Willst du das wirklich?"-Dialogen bestätigen muß.

Bernhard Geyer 1. Feb 2015 22:53

AW: Try Except Problem
 
Zitat:

Zitat von himitsu (Beitrag 1288510)
Ich hab es aufgegeben alle "Standards" selber nochmal zu setzen.

Wir bringen bei unseren Projekten einfach einen Compilerfehler wenn die (uralten) Compilerschalter falsch gesetzt sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 Uhr.
Seite 2 von 4     12 34      

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