Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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)

AlexII 31. Jan 2015 13:48

Try Except Problem
 
Hallo,

ich habe folgendes Problem. Ich lade eine Datei in mein Programm, falls das schief gehen soll, soll der alte Pfad wieder gesetzt werden. Das klappt aber irgendwie nicht, wieso eigentlich?


Delphi-Quellcode:
procedure TForm1.OpenDialog1BitBtnClick(Sender: TObject);
var
  str: String = '';
begin
  str := Edit1.Caption;

  try
    if OpenDialog1.Execute then
    begin
      Edit1.Caption := OpenDialog1.FileName;
    end;
  except
    on E: Exception do MessageDlg('Fehler: Die Datei konnte nicht geladen werden!'
    + sLineBreak + sLineBreak + E.ClassName + sLineBreak + E.Message, mtError, [mbOk], 0);

    Edit1.Caption := str; // Hier der Fehler: Syntax error, "ON" expected but "identifier EDIT1" found
  end;
end;

Danke!

DeddyH 31. Jan 2015 13:52

AW: Try Except Problem
 
begin und end kennst Du?

AlexII 31. Jan 2015 14:09

AW: Try Except Problem
 
Zitat:

Zitat von DeddyH (Beitrag 1288412)
begin und end kennst Du?

Ja, aber es hilft trotzdem nicht.

Delphi-Quellcode:
procedure TForm1.OpenDialog1BitBtnClick(Sender: TObject);
var
  str: String = '';
begin
  str := Edit1.Caption;

  try
    if OpenDialog1.Execute then
    begin
      Edit1.Caption := OpenDialog1.FileName;
    end;
  except
    on E: Exception do
    begin
      MessageDlg('Fehler: Die Datei konnte nicht geladen werden!'
      + sLineBreak + sLineBreak + E.ClassName + sLineBreak + E.Message, mtError, [mbOk], 0);
    end;

    Edit1.Caption := str; // Hier der Fehler: Syntax error, "ON" expected but "identifier EDIT1" found
  end;
end;

Plastewolf 31. Jan 2015 14:17

AW: Try Except Problem
 
Delphi-Quellcode:
procedure TForm1.OpenDialog1BitBtnClick(Sender: TObject);
var
  str: String = '';
begin
  str := Edit1.Caption;

  try
    if OpenDialog1.Execute then
    begin
      Edit1.Caption := OpenDialog1.FileName;
    end;
  except
    on E: Exception do
    begin
      MessageDlg('Fehler: Die Datei konnte nicht geladen werden!'
      + sLineBreak + sLineBreak + E.ClassName + sLineBreak + E.Message, mtError, [mbOk], 0);

      Edit1.Caption := str; // Hier der Fehler: Syntax error, "ON" expected but "identifier EDIT1" found
    end;
  end;
end;
Gruß

AlexII 31. Jan 2015 14:24

AW: Try Except Problem
 
Ah jah... alles klar! Danke!

Sir Rufo 31. Jan 2015 15:24

AW: Try Except Problem
 
Man kann es sich schwer oder eben einfach machen:
Delphi-Quellcode:
procedure TForm1.OpenDialog1BitBtnClick(Sender: TObject);
begin
    if OpenDialog1.Execute then
    begin
      LoadFile ( OpenDialog1.Filename );
      Edit1.Caption := OpenDialog1.FileName;
    end;
end;

himitsu 31. Jan 2015 15:53

AW: Try Except Problem
 
In dem Code gibt es eigentlich nichts zum Knallen und wenn es doch knallt, dann ist eh alles zu spät und dann hilft auch keine Exception-Behandlung mehr.

Und wenn ich mir den ersten Code so anseh:
  • Wo wird da eine Datei ausgelesen?
    Nichts da, also kann es dadurch auch nicht knallen und die Fehlermeldung ist somit total falsch und verwirrend.
  • Was sollte das mit der Variable und Caption?
    Die wird ausgelesen und genau so wieder zugesiwsen, also keinerlei Ändeurng und somit sinnlos.
  • Und das mit dem Begin+End ...
    Ich hätte gedacht das hättest du langsam mal gelernt.

Ergebnis siehe
Zitat:

Kaum macht man's richtig - schon funktioniert's :mrgreen:

jaenicke 1. Feb 2015 08:21

AW: Try Except Problem
 
Wenn das Laden fehlschlägt, sollte der Pfad sicherlich auch nicht angezeigt werden:
Delphi-Quellcode:
procedure TForm1.OpenDialog1BitBtnClick(Sender: TObject);
begin
  {$BOOLEVAL OFF}
  if OpenDialog1.Execute and LoadFile(OpenDialog1.Filename) then
    Edit1.Caption := OpenDialog1.FileName;
end;

Bernhard Geyer 1. Feb 2015 08:27

AW: Try Except Problem
 
Zitat:

Zitat von jaenicke (Beitrag 1288436)
Wenn das Laden fehlschlägt, sollte der Pfad sicherlich auch nicht angezeigt werden:
Delphi-Quellcode:
procedure TForm1.OpenDialog1BitBtnClick(Sender: TObject);
begin
  {$BOOLEVAL OFF}
  if OpenDialog1.Execute and LoadFile(OpenDialog1.Filename) then
    Edit1.Caption := OpenDialog1.FileName;
end;

Mit Booleval wird aber auf jedenfall die LoadFile-Methode ausgeführt auch wenn diese über einen alten Wert in OpenDialog1.Filename aufgerufen würde (z.B. Letzte Verwendung). Ich bin mir nicht sicher ob im abgebrochenen Zustand der String leer ist.

Sir Rufo 1. Feb 2015 09:45

AW: Try Except Problem
 
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):
Delphi-Quellcode:
procedure TForm1.LoadFileButtonClick( Sender : TObject );
begin
  if OpenDialog1.Execute then
  begin
    Memo1.LoadFromFile( OpenDialog1.Filename );
    Edit1.Text := OpenDialog1.Filename;
  end;
end;
Wenn jetzt
Delphi-Quellcode:
Memo1.LoadFromFile( OpenDialog1.Filename );
eine Exception auslöst, dann wird
Delphi-Quellcode:
Edit1
nicht verändert und es erscheint der Dialog mit der Fehlermeldung.

Ist es das Verhalten, was gesucht wird?

Und komisch, das bekommt man ohne diese seltsame Schnickschnack Programmierung. Und irgendwie ist es auch noch einfacher.

Das Herumfuhrwerken an Exceptions und das Erstellen von Wrapper-Methoden, die im Fall der Fälle dann statt einer Exception einen bestimmten Rückgabewert liefern, führt meistens nur zu wesentlich mehr und unlesbarem Code und in 99% aller Fälle dazu, dass Programmierfehler unentdeckt bleiben.

Exceptions sind nicht der Feind, aber das Abfangen ohne wirkliche Behandlung ist der erste Schritt um die Anwendung zu meinem Feind zu machen.

Ja ich höre schon wieder die Stimmen "aaaaaber, ...". Natürlich kann man Exceptions abfangen, aber eben nur wenn man diese auch behandeln kann. Ohne sinnvolle Behandlung ist nur noch ein erneutes Werfen sinnvoll, wobei hier auch eine Übersetzung bzw. Umleitung auf eine eigene Exceptionklasse erfolgen kann.
Delphi-Quellcode:
MyConnection.StartTransaction;
try
  MyQueryA.ExecSQL;
  MyQueryB.ExecSQL;
  MyConnection.Commit;
except
  MyConnection.Rollback;
  raise;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.
Seite 1 von 4  1 23     Letzte »    

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