![]() |
Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Ich hab mich schon immer gefragt wie andere hier das mit dem Try Finally Block machen. Guckt man sich fremden Code an, bekommt jedes Objekt oft seinen eigenen Block. Das habe ich mir irgendwann so abgeguckt und mache es auch:
Delphi-Quellcode:
Allerdings denke ich mir manchmal, dass es Quatsch ist. Denn wenn es im oberen Beispiel mittendrin ein Error gibt, unterscheidet das System nicht zwischen Bitmap und StringList Error. Zuerst geht es zum sl-Finally, dann zum Bmp-Finally. Warum also nicht gleich so?
Bmp := TBitmap.Create;
try { Hier gibt es keinen Code } sl := TStringList.Create; try { Es gibt nur hier Code } //Hier gibt es einen Fehler finally sl.Free; end; { Hier gibt es keinen Code } finally Bmp.Free; end;
Delphi-Quellcode:
Wie gesagt, ich sehe die obere Variante sehr oft, nur sehe ich keinen Sinn drin.
var
Bmp: TBitmap; sl: TStringList; begin Bmp := TBitmap.Create; sl := TStringList.Create; try { Es gibt nur hier Code } //Hier gibt es einen Fehler finally sl.Free; Bmp.Free; end; end; |
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Da ich mich nicht wiederholen will:
![]() |
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Deleted - war Quatsch.
|
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Zitat:
|
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
DeddyH, gute Erklärung, aber das Beispiel ist leicht konstruiert. Sehe ich eigentlich wie du, aber das Beispiel entspricht nicht ganz meinem Beispiel oben. Auch die Bemerkung von uligerhardt war ok, ist aber nun weg. Konstruiert, weil ich hier nicht TBitmap mit TIniFile kombiniert habe, sondern TBitmap mit TStringList. Da kracht es nicht bei der Initialisierung. Bei TIniFile kann es auch bei Create krachen, im oberen Beispiel eher nicht.
|
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Beide Varianten sind Schrott, da der Finaly-Block nie erreicht wird, wenn es zum Beispiel in TBitmap.Create knallt.
|
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Zitat:
Zitat:
Ich persönlich mag zu viele Verschachtelungen nicht. Zwei sind noch ok, aber für mehr bevorzuge ich diese Variante:
Delphi-Quellcode:
oder
var
Bmp: TBitmap; sl: TStringList; begin Bmp := nil; sl := nil; try Bmp := TBitmap.Create; sl := TStringList.Create; { Es gibt nur hier Code } //Hier gibt es einen Fehler finally sl.Free; Bmp.Free; end; end;
Delphi-Quellcode:
var
Bmp: TBitmap; sl: TStringList; begin sl := nil; Bmp := TBitmap.Create; try sl := TStringList.Create; { Es gibt nur hier Code } //Hier gibt es einen Fehler finally sl.Free; Bmp.Free; end; end; |
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Wegen strom- bzw netzwerkausfall schreibe ich mit dem Handy und suche deshalb mal nicht frühere threads raus. Aber meine Meinung:
Try ... finally fuer myobject.free macht m.e. nur selten Sinn. Erwartete Probleme wie io-acceptions sollte man natürlich h abfangen und behandeln. Aber jedes .create mit Einem Try zu schützen bringt m.e. nichts. Das Programm ist ab der stelle ohnehin in einem undefinierten und fehlerhaften Zustand und sollte neu gestartet (und repariert) werden oder was auch immer. Ob da im Speicher noch eine objektleiche liegt ist dann auch egal. Wie gesagt: Fehler behandeln ist wichtig. Free in finally zu legen (ohne sonstige massnahmen) bringt m.e. nix. |
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Na gut. Ich hab zwar noch nie erlebt, dass eine der oberen Klassen schon bei Create gekracht hat, aber anderseits soll es irgendwo auf der Welt mal kleine Hunde geregnet haben. Somit will ich nicht ausschließen, es mal vorkommen kann. Also die weiterhin erste Methode :thumb:
|
AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Nimm doch mal einen FileStream und versuch den auf ein schreibgeschütztes Medium schreiben zu lassen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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