AGB  ·  Datenschutz  ·  Impressum  







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

try .. except ... oder finally?

Ein Thema von mifuno · begonnen am 22. Jun 2005 · letzter Beitrag vom 30. Jun 2005
Antwort Antwort
mifuno

Registriert seit: 9. Jun 2005
10 Beiträge
 
Delphi 7 Personal
 
#1

try .. except ... oder finally?

  Alt 22. Jun 2005, 18:14
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;
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

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

  Alt 22. Jun 2005, 18:20
Warum benutzt du nicht einfach Delphi-Referenz durchsuchenFileExists ?
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;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von ltiefland
ltiefland

Registriert seit: 2. Mai 2005
Ort: Marl
63 Beiträge
 
Delphi 2005 Professional
 
#3

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

  Alt 22. Jun 2005, 18:21
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.
Lars Tiefland
Live Long And Prosper,
Lars Tiefland
admin at GBS, a Mod for STEF2, New mod versions and support!
Download Opera 8
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

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

  Alt 22. Jun 2005, 18:27
Ich glaube nicht, dass es so herum funktioniert .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Waldteufel
(Gast)

n/a Beiträge
 
#5

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

  Alt 22. Jun 2005, 18:28
Hi.
@ltiefland: Öhm... 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?
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

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

  Alt 22. Jun 2005, 18:39
Sinnlos in der Hinsicht, als dass das Programm auf jeden Fall geschlossen wird .

[OT]
Delphi-Quellcode:
Hausmeister.BesenHolen; // Speicherbereinigung
Hausmeister.ResteAuffegen; // Speicherbereinigung
Seit wann hat Delphi einen Garbage Collector ?
[/OT]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von BenBE
BenBE

Registriert seit: 3. Apr 2005
Ort: Jahnsdorf
48 Beiträge
 
Delphi 5 Enterprise
 
#7

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

  Alt 30. Jun 2005, 15:41
[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.
Benny Baumann
Je komplexer das System, desto kleiner die Fehler; je kleiner die Fehler, desto häufiger ihr Auftreten!
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#8

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

  Alt 30. Jun 2005, 16:28
[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"
  Mit Zitat antworten Zitat
aps

Registriert seit: 21. Sep 2003
Ort: Hameln
62 Beiträge
 
Delphi 6 Professional
 
#9

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

  Alt 30. Jun 2005, 16:43
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.
Andreas
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#10

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

  Alt 30. Jun 2005, 18:42
Hallo zusammen,
heiße Diskussion hier...

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.

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
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  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 13:58 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