AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Try Except End; verschachteln

Ein Thema von Schwedenbitter · begonnen am 5. Nov 2010 · letzter Beitrag vom 7. Nov 2010
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Try Except End; verschachteln

  Alt 5. Nov 2010, 23:28
@NamenLozer:
Dein (ungetesteter) Code passt wie die Faust aufs Auge! Er läuft bei mir perfekt.

Richtig ist insoweit auch, dass mich das Format nicht wirklich interessiert. Somit spare ich die Zeit und Performance, vorher erst den Header auslesen zu müssen. Da standard bei meiner Software PNG, dann JPG und erst zum Schluss BMP ist, kann man super die Reihenfolge des durch Exception geschützten Ladens bestimmen...
Ich komme echt ins Schwärmen!

Herzlichen Dank, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Try Except End; verschachteln

  Alt 7. Nov 2010, 21:16
die Try-Except-Verschachtelungen wurden ja nurn schon geklärt, aber nun noch was zur Verschachtelung von Try-Finally, bzw. des Resourcen-Schutzblocks:
Zitat:
Delphi-Quellcode:
tPNG := TPngObject.Create;
tJPG := TJPEGImage.Create; // 1
tBMP := TBitmap.Create;
Try
  ...
Finally
  tPNG.Free;
  tJPG.Free;
  tBMP.Free;
End;
1: Hier eine Exception (z.B. OutOfMemory und Co.) und schon wird tPNG nicht freigegeben.

Also eigentlich sollte es so aussehn, damit alles korrekt freigegeben würde:
Delphi-Quellcode:
tPNG := TPngObject.Create;
Try
  tJPG := TJPEGImage.Create;
  Try
    tBMP := TBitmap.Create;
    Try
      ...
    Finally
      tBMP.Free;
    End;
  Finally
    tJPG.Free;
  End;
Finally
  tPNG.Free;
End;
Eventuell geht auch Folgendes.
Dieses geht aber nur, wenn man davon ausgehn kann, daß es beim Freigeben (hier in .Free) keine Probleme auftreten können.
(OK, Fehler, welche sowieso den nachfolgenden Programmfluß irreversibel schädigen, kann man gern ignorieren, da dann sowieso alles Egal ist )
Delphi-Quellcode:
tPNG := nil;
tJPG := nil;
tBMP := nil;
Try
  tPNG := TPngObject.Create;
  tJPG := TJPEGImage.Create;
  tBMP := TBitmap.Create;
  ...
Finally
  tPNG.Free;
  tJPG.Free;
  tBMP.Free;
End;
bzw. "verkürzt":
Delphi-Quellcode:
tJPG := nil;
tBMP := nil;
tPNG := TPngObject.Create;
Try
  tJPG := TJPEGImage.Create;
  tBMP := TBitmap.Create;
  ...
Finally
  tPNG.Free;
  tJPG.Free;
  tBMP.Free;
End;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Try Except End; verschachteln

  Alt 7. Nov 2010, 22:43
Tritt im Konstruktor eine Exception auf, wird der schon belegte Speicher und das Objekt automatisch wieder freigegeben. Oder ich mache seit 15 Jahren was falsch, wenn ich schreibe:
Delphi-Quellcode:
obj := TObject.Create
try
  ...;
  ...;
finally
  obj.Free:
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Try Except End; verschachteln

  Alt 7. Nov 2010, 23:06
IMHO nein
ich hatte himitsu auch nicht anders verstanden
Zitat:
Also eigentlich sollte es so aussehn, damit alles korrekt freigegeben würde:
der verkürzte Teil könnte IMHO bei tBMP.Free knallen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Try Except End; verschachteln

  Alt 7. Nov 2010, 23:50
Zitat:
Delphi-Quellcode:
tPNG := TPngObject.Create;
tJPG := TJPEGImage.Create; // hier Exception im Constructor
tBMP := TBitmap.Create;
Try
  ...
Finally
  tPNG.Free;
  tJPG.Free;
  tBMP.Free;
End;
Nein Luckie, du täuchst dich nicht.
Bei einem Objekt, stimmt diese Annahme.
Tritt hier aber z.B. in TJPEGImage.Create eine Exception auf, so wird dieses Objekt von Delphi freigeben,
aber das vorher erstellte tPNG wird dabei nicht mit freigegben ... wie auch.

> tPNG/TPngObject wird erstellt und bleibt erhalten
> tJPG/TJPEGImage wird zwar erstellt, aber durch die Exception automatisch freigegeben
> tBMP/TBitmap wird erst garnicht erstellt, da die Verarbeitung hier noch nicht vorbeikam
> der Finally-Block und alle .Free werden nicht aufgerufen, da dieses ebenfalls nicht mehr ausgeführt werden
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:21 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