AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

try ... except

Ein Thema von Counter909 · begonnen am 30. Aug 2009 · letzter Beitrag vom 31. Aug 2009
Antwort Antwort
Counter909

Registriert seit: 10. Aug 2006
129 Beiträge
 
#1

try ... except

  Alt 30. Aug 2009, 21:18
Hallo,


vllt eine blöde Frage, werdet ihr bestimmt auch sofort wissen, aber i-wie bin ich gerade daüfr zu blöd..

Ich möchte eine bestimmte Datei laden (zum Beispiel: C:/Programme/Delphi/test.txt)


So, wenn diese Datei nicht existiert, kommt natürlich ein dicker Fehler, sodass das Programm dann stoppt und beendet wird, weil er die Datei nicht finden kann. Deshalb gibt es doch die

Try..except Anweisung oder ? in der try routine wird der Risikobereich verwertet und falls dort ein Fehler auftritt automatisch an except weitergegeben?

nur wenn ich dann

Delphi-Quellcode:
try
 s1.loadfromfile('C:/Programme/Delphi/test.txt')
 s1.free
except
 showmessage('Die Datei ist nicht vorhanden!')
end;
mache, dann kommt immer der Fehler, dass er die Datei nicht findet und es Programm "stürzt" sozusagen ab


mfg
counter
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.300 Beiträge
 
Delphi 12 Athens
 
#2

Re: try ... except

  Alt 30. Aug 2009, 21:23
Hallo

wenn du dein Programm aus der IDE startest bekommst du immer die Meldung angezeigt. Auch mit try/except. Starte mal das Programm ohne die IDE und du wirst deine eigene Message sehen.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.359 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: try ... except

  Alt 30. Aug 2009, 21:23
Erstens wirkt try..except standardmäßig nur außerhalb von Delphi, wenn du das Programm also von Delphi aus ausführst, dann stoppt das Programm trotzdem.

Zweitens solltest du lieber FileExists benutzen um vorher zu schauen, ob die Datei existiert.

Und drittens ist unter Windows das Pfadtrennzeichen \ und nicht / wie du es benutzt hast...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Counter909

Registriert seit: 10. Aug 2006
129 Beiträge
 
#4

Re: try ... except

  Alt 30. Aug 2009, 21:32
Fileexists war wohl der springende Punkt und hat auch gleich geholfen jetzt funktioniert alles. Man kann es auch imemr kompliziert wollen


Besten Dank jaenicke&haentschman
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#5

Re: try ... except

  Alt 30. Aug 2009, 21:45
trotz FileExists, solltest du eine Fehlerbehandlhng machen, denn es könnten auch noch Zugriffsfehler auftreten.
z.B. Datei ist gesperrt (fehlende Zugriffsrechte oder sie ist bereits ohne passende Sharingrechte geöfnet)


Try-Except wirkt auch innerhalb der IDE bzw. des Debuggers,
nur daß der Debugger die Exceptions dennoch anzeigt, damit der Programmierer mitbekommt, wenn etwas nicht stimmt.
> diese Debugger-Exceptions lassen sich in den Projektoptionen auch abschalten

Dann gehört sl.Free nicht in das Try-Except hinein, denn was passiert, wenn bei LoadFromFile die bearbeitung abgebrochen und an den Except-Bock abgegeben wird?
Genau, sl.Free wird nicht aufgerufen und das Objekt auch nicht freigegeben!

Eigentlich gehört hier noch ein Try-Finally drumrum
Delphi-Quellcode:
sl := TStringList.Create;
try
  // ... mach etwas ...
finally
  sl.Free;
end;
also
Delphi-Quellcode:
sl := TStringList.Create;
try
  try
    s1.loadfromfile('C:/Programme/Delphi/test.txt');
  except
    showmessage('Fehler beim Lesen!');
  end;
finally
  sl.Free;
end;
Aber da Try-Except die Bearbeitung fortestzt und zwischen .Create und .Free nur das Try Except(plus dessen Inhalt) liegt, könnte man Try-Finally auch mal ausnahmsweise weglassen
Delphi-Quellcode:
sl := TStringList.Create;
try
  s1.loadfromfile('C:/Programme/Delphi/test.txt')
except
  showmessage('Die Datei ist nicht vorhanden!')
end;
s1.free;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

Re: try ... except

  Alt 31. Aug 2009, 00: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr.
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