Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi try .. except ... oder finally? (https://www.delphipraxis.net/48247-try-except-oder-finally.html)

mifuno 22. Jun 2005 18:14


try .. except ... oder finally?
 
hallo,
ich habe ein kleines spiel, bei dem ich die levels in eine verkette liste lese und die spielsteine immer über

img_zelle:= TBitmap.Create;
img_zelle.LoadFromFile(CStein);
...
img_zelle.free;

gesetzt und befreit werden.

Die Bilder werden dabei aus einem Ordner geladen. Das Problem ist aber nun, wenn die Bilder nicht mehr vorhanden sinn. Dies kann ja sowohl am Start des Spiels passieren, also auch, wenn während das Spiel läuft einer auf die Idee kommt, die Bilder aus dem Ordner zu löschen oder umzubennen. Also muss ich da wohl ein try...except reinsetzen um das Programm dann zu beenden.

Im Tutorial von http://www.dsdt.info/tutorials/exceptions/?page=5 hatte ich gelesen, dass man Speicherbefreiung immer im finally-Teil abarbeiten soll, da man somit sicherstellen kann, dass dies auch geschieht, wenn vorher ein Fehler aufgetreten ist. Aber das bringt mir eigentlich nichts, da dann trotzdem eine Fehlermeldung kommt, dass ein Bild nicht geladen werden konnte. Gibt es keine try..Except..finally anweisung?

oder muss ich dann in meinem beispiel das free des bildes und der liste zweimal ausführen

Delphi-Quellcode:
try
   img_zelle:= TBitmap.Create;
   img_zelle.LoadFromFile(CStein3);
   ...
except
  img_zelle.free;
  // Befreit den Speicherplatz der verketeten Liste
  destroyList;
  showMessage('Bild wurde nicht gefunden');
  close;
end;
  img_zelle.free;

Khabarakh 22. Jun 2005 18:20

Re: try .. except ... oder finally?
 
Warum benutzt du nicht einfach Delphi-Referenz durchsuchenFileExists :zwinker: ?
Es können aber natürlich noch andere Exceptions auftreten, die würde ich so abfangen:
Delphi-Quellcode:
Bit := TBitmap.Create;
try
  try
    Bit.LoadFromFile(...);
  finally
    Bit.Free;
  end;
except
  ShowMessage(...);
  Close;
end;

ltiefland 22. Jun 2005 18:21

Re: try .. except ... oder finally?
 
Zitat:

Zitat von mifuno
Delphi-Quellcode:
try
   img_zelle:= TBitmap.Create;
   img_zelle.LoadFromFile(CStein3);
   ...
except
  img_zelle.free;
  // Befreit den Speicherplatz der verketeten Liste
  destroyList;
  showMessage('Bild wurde nicht gefunden');
  close;
end;
  img_zelle.free;

Versuche es doch mal so:

Delphi-Quellcode:
try
   try
      img_zelle:= TBitmap.Create;
      img_zelle.LoadFromFile(CStein3);
      ...
   except
   end;
finally
  img_zelle.free;
  // Befreit den Speicherplatz der verketeten Liste
  destroyList;
  showMessage('Bild wurde nicht gefunden');
  close;
end;
So sollte es gehen. Ein ähnliches Beispiel ist, wenn ich mich jetzt nicht irre, auch in der Delphi Hilfe drin.

Khabarakh 22. Jun 2005 18:27

Re: try .. except ... oder finally?
 
Ich glaube nicht, dass es so herum funktioniert :wink: .

Waldteufel 22. Jun 2005 18:28

Re: try .. except ... oder finally?
 
Hi.
@ltiefland: Öhm... :gruebel: Ist das nicht das Selbe, wie:
Delphi-Quellcode:
try
  HierKannVielSchiefGehen(x, y, z, 0, 0, 0); // x / 0, y / 0, z / 0 ;-)
except
  ShowMessage('Ich hab''s gewusst...');
end;
Hausmeister.BesenHolen;      // Speicherbereinigung
Hausmeister.ResteAuffegen;   // Speicherbereinigung
Der Fehler wird imho doch bei deinem Code durch das Except schon abgefangen, also ist das umschließende try...finally noch nutzlos... Oder?

Khabarakh 22. Jun 2005 18:39

Re: try .. except ... oder finally?
 
Sinnlos in der Hinsicht, als dass das Programm auf jeden Fall geschlossen wird :wink: .

[OT]
Delphi-Quellcode:
Hausmeister.BesenHolen;      // Speicherbereinigung
Hausmeister.ResteAuffegen;   // Speicherbereinigung
Seit wann hat Delphi einen Garbage Collector :mrgreen: ?
[/OT]

BenBE 30. Jun 2005 15:41

Re: try .. except ... oder finally?
 
[ot]Irgendwie wundert es mich hier kaum noch, dass pro Tag huntert verschiedene Themen aufgemacht werden und viele davon auch noch doppelt ... Jeder sagt was, aber keine hat von dem, was er sagt, Ahnung ... Die angesprochenen bitte demnächst erst denken und ansonsten Klappe halten; TIA.[/ot]

Aber gut, zum Thema:
Wenn der Konstruktor oder eine Operation mit einem Objekt fehlschlagen kann, so sieht die richtige Verfahrensweise so aus:
Delphi-Quellcode:
try
    Image := TBitmap.Create;
    try
        Image.LoadFromFile(GehtSchief);

        //Bild weiterverarbeiten
    finally
        FreeAndNil(Image);
    end;
except
    ShowMessage('Fehler aufgetreten; interessiert aber eh keinen!');
end;
HTH.

MfG,
BenBE.

P.S.: Diese Informationen hätten auch in der DOH gestanden; man hätte sich nur mal den Object Pascal Reference Part durchlesen müssen ...

Anm.: Ich weiß, dass man sich durch solche Posts nicht beliebter macht, aber in diesem Thread war die Unwissenheit, Postcount-Hochtreiberei und ungetester Source in höchster Konzentration vertreten. :twisted:

barf00s 30. Jun 2005 16:28

Re: try .. except ... oder finally?
 
[ot]und ständiges rumsülzen und weitere sinnlose code posts helfen da auch nich weiter[/ot]

ltiefland hat bereits die richtige lösung angeboten......


im zweifel einfach mal probiern, anstelle gleich wieder zu nerfen "määäh, es geht nich"

aps 30. Jun 2005 16:43

Re: try .. except ... oder finally?
 
Zitat:

Zitat von barf00s
ltiefland hat bereits die richtige lösung angeboten......

Nö. Beachte:
Delphi-Quellcode:
try
  try
    ...
  except
    ...
  end;
finally
  ...
end;
ist etwas anderes als
Delphi-Quellcode:
try
  try
    ...
  finally
    ...
  end;
except
  ...
end;
Nur Variante 2 ist richtig. Denn ein except-Block wird nur im Fall einer Exception ausgeführt UND löst die Exception auf, während ein finally-Block unabhängig von einer Exception ausgeführt wird (d. h. immer), eine geworfene Exception selbst wird aber nicht behandelt und entsprechend auch nicht aufgelöst.

IMHO wäre es eine sinnvolle Erweiterung der Delphi-Sprache, wenn auch sowas zulässig wäre:
Delphi-Quellcode:
try
  ...
finally
  ...
except
  ...
end
Leider ist das - zumindest derzeit - nicht vorgesehen.

Marphy 30. Jun 2005 18:42

Re: try .. except ... oder finally?
 
Hallo zusammen,
heiße Diskussion hier... :firejump:

Zitat:

Zitat von BenBE
Jeder sagt was, aber keine hat von dem, was er sagt, Ahnung ... Die angesprochenen bitte demnächst erst denken und ansonsten Klappe halten

Da hast du (in diesem Fall) Recht.

Zitat:

Wenn der Konstruktor oder eine Operation mit einem Objekt fehlschlagen kann, so sieht die richtige Verfahrensweise so aus:
Delphi-Quellcode:
try
    Image := TBitmap.Create;
    try
        Image.LoadFromFile(GehtSchief);

        //Bild weiterverarbeiten
    finally
        FreeAndNil(Image);
    end;
except
    ShowMessage('Fehler aufgetreten; interessiert aber eh keinen!');
end;

Ja, hier stimmt's. :thumb:

Die IMHO bessere Lösung wäre aber diese (falls im except-Block die Prozedur nicht abgebrochen wird):
Delphi-Quellcode:
Image := TBitmap.Create;
try
  Image.LoadFromFile(GehtSchief);
  //Bild weiterverarbeiten
except
  ShowMessage('Fehler aufgetreten; interessiert aber eh keinen!');
end;
FreeAndNil(Image);
Gruß, Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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