Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zwei Objekte in einem oder zwei Try Finaly Blöcke? (https://www.delphipraxis.net/184699-zwei-objekte-einem-oder-zwei-try-finaly-bloecke.html)

Popov 15. Apr 2015 12:45

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:
  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;
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?
Delphi-Quellcode:
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;
Wie gesagt, ich sehe die obere Variante sehr oft, nur sehe ich keinen Sinn drin.

DeddyH 15. Apr 2015 12:51

AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
 
Da ich mich nicht wiederholen will: http://forum.delphi-treff.de/index.p...verschachteln/

uligerhardt 15. Apr 2015 12:53

AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
 
Deleted - war Quatsch.

QuickAndDirty 15. Apr 2015 13:08

AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
 
Zitat:

Zitat von DeddyH (Beitrag 1297822)
Da ich mich nicht wiederholen will: http://forum.delphi-treff.de/index.p...verschachteln/

Werden Objekt-Variablen in Delphi nicht implizit mit nil initialisiert?

Popov 15. Apr 2015 13:09

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.

BadenPower 15. Apr 2015 13:10

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.

SMO 15. Apr 2015 13:13

AW: Zwei Objekte in einem oder zwei Try Finaly Blöcke?
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1297827)
Zitat:

Zitat von DeddyH (Beitrag 1297822)
Da ich mich nicht wiederholen will: http://forum.delphi-treff.de/index.p...verschachteln/

Werden Objekt-Variablen in Delphi nicht implizit mit nil initialisiert?

Nein, lokale Variablen liegen auf dem Stack und werden nicht automatisch initialisiert, Ausnahmen sind managed types wie strings, dynamische Arrays und Interfaces.


Zitat:

Zitat von BadenPower (Beitrag 1297832)
Beide Varianten sind Schrott, da der Finaly-Block nie erreicht wird, wenn es zum Beispiel in TBitmap.Create knallt.

Der Finally-Block muss auch nicht erreicht werden, wenn es in TBitmap.Create knallt, insofern also kein Schrott.

Ich persönlich mag zu viele Verschachtelungen nicht. Zwei sind noch ok, aber für mehr bevorzuge ich diese Variante:

Delphi-Quellcode:
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;
oder
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;

stahli 15. Apr 2015 13:14

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.

Popov 15. Apr 2015 13:16

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:

DeddyH 15. Apr 2015 13:17

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 12:15 Uhr.
Seite 1 von 4  1 23     Letzte »    

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