Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi try except Frage (https://www.delphipraxis.net/117151-try-except-frage.html)

haentschman 12. Jul 2008 19:52


try except Frage
 
Hallo alle miteinander...

ich seh den Wald vor Bäumen nicht... :(
Delphi-Quellcode:
UDateiListe.Add(Ziel);
try
  fStream:= TFileStream.Create(Ziel,fmCreate or fmShareDenyNone);
    try
      idHTTP1.Get(Quelle, fStream);
    finally
      fStream.Free;
    end;
except
  MessageDlg('Update fehlgeschlagen...(Datei herunterladen)',mtError,[mbOK],0);
  for A := 0 to UDateiListe.Count - 1 do
    begin
      try
        DeleteFile(UDateiliste.Strings[A]);
      except
      end;
    end;
  Application.Terminate;
end;
soll wie folgt funktionieren:
- der Quellcode ist ein Teil einer Procedure welche für jede Datei welche downgeloaded werden soll ausgeführt wird.
- tritt irgend ein Fehler auf soll die Meldung angezeigt, dann die vorher downgeloadeten Dateien (UDateiListe) gelöscht und das Update beendet werden.
- funktioniert auch prächtig, wenn alle Quelldateien vorhanden sind.

beim Fehlertest (Quelldatei existiert nicht) passiert folgendes:
- Meldung erscheint (ist ja ok)
- Dateien werden gelöscht. (auch ok)
- die Application (update.exe) wird nicht beendet sondern fährt mit der nächsten Datei fort. :wiejetzt:

PS: die update.exe ist auch in der UDateiListe vorhanden und ist nicht löschbar, da (noch) gestartet. Das sollte aber über den try except Block beim Löschen abgefangen werden.

Habe ich die Grundlagen falsch verstanden ? :gruebel:
Könnte mir jemand den Knoten lösen ?

Danke....

1234588 12. Jul 2008 20:49

Re: try except Frage
 
generell was zu den speicherschutzbloeken. ich halte es fuer einen schlechten stil sie fuer alles zu verwenden. da z.b. DeleteFile() eine funktion ist, die einen booleanschen wert zurueck gibt, wuerde ich eher das ergebnis auswerten. in der oben vorliegenden konstellation macht das ganze noch weniger sinn, da egal ob DeleteFile() erfolgreich war oder nicht im except part sowieso nichts passiert. es ist als ob DeleteFile() ohne try expect dastehen wuerde, nur eben langsamer.
gewoehn es dir lieber nicht an und arbeite nur wenn noetig mit speicherschutzbloecken :)

zu deinem eigentlichen problem:

ich wuerde den inhalt des streams pruefen, so kannst du dir sicher sein, ob das ganze geklappt hat oder nicht.
des weiteres wuerde ich auch pruefen, ob geloescht wurde oder nicht:
Delphi-Quellcode:
  if DeleteFile(datei) then
    ShowMessage('erfolgreich') else
      ShowMessage('loeschen nicht erfolgreich') else
ich hoffe ich konnte dir ein wenig weiter helfen :)

rollstuhlfahrer 12. Jul 2008 21:41

Re: try except Frage
 
zum Beenden:

Application.Terminate ist ein sehr sehr schlechter Stil. Stecke den Download in eine Extra Funktion, die einen boolischen R+ckgabewert hat. Ist der Wert WAHR, dann fahre fort, ansonsten löschen und beenden. Aus der Funktion brichst du, nachdem du Result auf FALSE gesetzt hast mit Exit aus.
Zum Beenden empfehle ich dir:
  • Form.Close
  • PostQuitMessage
  • Halt, welches dann aber nicht aufräumt (eher doch nicht so zu empfehlen)

Bernhard

Nochwas: Konstruktoren haben in Speicherschutzblöcken nichts verloren. Entweder es klappt auf anhieb oder nicht. Wenns nicht klappt, schlägt auch .Free auf jeden Fall fehl (da irendwie nicht <> nil).

Luckie 12. Jul 2008 22:49

Re: try except Frage
 
Zitat:

Zitat von 1234588
Delphi-Quellcode:
  if DeleteFile(datei) then
    ShowMessage('erfolgreich') else
      ShowMessage('loeschen nicht erfolgreich') else

Wenn wir schon soweit gekommen sind, dann machen wir doch auch noch den letzten Schritt:
Delphi-Quellcode:
if not Deletefile(...) then
  ShowMessage(SysErrorMessage8GetLastError));
Wenn es geklappt hat interessiert mich eine Meldung nicht. Aber wenn es nicht geklappt hat, möchte ich gerne wissen, warum nicht. ;)

haentschman 12. Jul 2008 22:55

Re: try except Frage
 
Guten Abend...

folgendermaßen geändert.
Delphi-Quellcode:
UDateiListe.Add(Ziel);
  try
    fStream:= TFileStream.Create(Ziel,fmCreate or fmShareDenyNone);
    try
      idHTTP1.Get(Quelle, fStream);
    except
      MessageDlg('Update fehlgeschlagen...(Datei herunterladen)',mtError,[mbOK],0);
      for A := 0 to UDateiListe.Count - 1 do
        begin
          DeleteFile(UDateiliste.Strings[A]);
        end;
      FUMain.Close;
    end;
  finally
    fStream.Free;
  end;
except und finally vertauscht, Application.Terminate (warum auch immer ich das so gemacht habe) gegen Close getauscht ...

Danke an alle. :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz