AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zwei Objekte in einem oder zwei Try Finaly Blöcke?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Popov · begonnen am 15. Apr 2015 · letzter Beitrag vom 15. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2      
Popov
(Gast)

n/a Beiträge
 
#1

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

  Alt 15. Apr 2015, 13:48
Ich widerspreche dir nicht. Mache ich im Grunde auch. Aber wann man mal wieder eine Prozedur hat bei der man paar Objekte auf einmal bracht, dann wird der Code lang, noch bevor man losgelegt hat.
Delphi-Quellcode:
var
  Bmp1, Bmp2, Bmp3, Bmp4, Bmp5: TBitmap;
begin
  Bmp1 := TBitmap.Create;
  try
    Bmp2 := TBitmap.Create;
    try
      Bmp3 := TBitmap.Create;
      try
        Bmp4 := TBitmap.Create;
        try
          Bmp5 := TBitmap.Create;
          try
            //Hier tue was
          finally
            Bmp5.Free;
          end;
        finally
          Bmp4.Free;
        end;
      finally
        Bmp3.Free;
      end;
    finally
      Bmp2.Free;
    end;
  finally
    Bmp1.Free;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 15. Apr 2015, 13:51
Da würde ich mir eher Gedanken machen, ob sich das nicht in kleinere Portionen aufteilen lässt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 15. Apr 2015, 13:53
@Popov

Da reicht genau ein try finally Block aus.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 15. Apr 2015, 13:59
Man muß auch nicht nur an den Constructor denken, sondern auch an den Destructor.

Delphi-Quellcode:
B := nil;
A := TMyClass.Create;
try
  B := TMyClass.Create;
  ...
finally
  A.Free; // wenn es hier knallt, dann hat man ein Leck
  B.Free;
end;
Lösungen:
* doch nicht zusammenfassen

oder
Delphi-Quellcode:
finally
  B.Free;
  A.Free; // wenn es hier knallt, dann ist es egal, aber es darf natürlich nicht schon in B.Free knallen
end;
oder so
Delphi-Quellcode:
finally
  try
    A.Free;
  finally
    B.Free;
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 15. Apr 2015, 14:06
@himitsu

Das Erzeugen einer Klasse kann in die Hose gehen und ein völlig korrektes Verhalten der Klasse sein. Eine Exception im destructor ist immer ein absolutes Fehlverhalten der Klasse. Somit gehört dein Beispiel in die Kategorie "paranoide Programmierung".
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 15. Apr 2015, 14:19
Jetzt will ich doch nochmal einhaken (kann auch wieder am Rechner schreiben):

Delphi-Quellcode:
B := nil;
 A := TMyClass.Create;
try
   B := TMyClass.Create;
   EuroÜberweisenVonStahliZuHimi(B.Value);
finally
   A.Free; // wenn es hier knallt, dann hat man ein Leck
   B.Free;
end;
Wenn Du als Nutzer obiges Programm ausführst und B.Create knallt - warum auch immer - wirst Du mit dem Programm nicht glücklich werden.
Ob da noch Speicher allociert ist oder nicht, wäre da nebensächlich.

Du erfährst als Nutzer nicht, dass die Überweisung nicht funktioniert hat.
Ok, es wird kein Speicher verschwendet aber das ist doch sowas von egal.

Besser wäre, wenn es eine Fehlermeldung gibt. Entweder eine Schutzverletzung oder eine nette Erklärung wie "Die Überweisung konnte nicht durchgeführt werden!".
In jedem Fall muss die Software gefixt (oder einer neue Version verkauft ) werden.

Liege ich da so falsch mit der Ansicht?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 15. Apr 2015, 14:22
Meiner Meinung nach ja. Exceptions sind doch nichts Böses, soll man bei jedem Auftreten einer solchen das Programm neu starten? Oder einfach warten, bis der Speicher vollgelaufen ist?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 15. Apr 2015, 14:34
Aber es geht doch hier offensichtlich um keine erwarteten Probleme.

Wenn ich eine Ini einlesen will und das Laufwerk existiert nicht, dann muss ich das berücksichtigen und das Problem behandeln (z.B. Standardwerte benutzen oder Hinweise ausgeben oder Programmteile sperren oder was auch immer).
Alles super. Es gibt verschiedene Wege. Den normalen Weg und in bestimmten Fällen Alternativen. Das Programm arbeitet wie vorgesehen.

Wenn aber TPanel.Create nicht funktioniert (warum auch immer - Speicher defekt, Virus, "Beta-Bugfix" vom Hersteller oder falsche Mondphase) dann bringt es nichts, das aufrufende Formular mit Free freizugeben.
Das Programm ist nicht funktionsfähig und muss schnellstens repariert werden.
Wenn der Kunde das Formular 1000 mal startet wird zwar der Speicher nicht so schön aufgeräumt wie mit finally aber da kommt es dann doch wirklich nicht mehr drauf an.
Mit Daten-Objekten wäre diese stillschweigende Fehlerunterdrückung noch schlimmer, da der User dann u.U. gar nicht merkt, dass irgendwas nicht funktioniert.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 15. Apr 2015, 14:38
Irgendwie habe ich das Gefühl, dass Du finally mit except verwechselst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 15. Apr 2015, 14:49
Glaube ich eigentlich nicht.
Der finally- Block wird in jedem Fall ausgeführt, auch wenn es in try knallt. Richtig?
Aber die erwartete Überweisung wird nicht durchgeführt und es erfolgt kein Fehlerhinweis.

--> oder unterdrückt finally die Fehlermeldung nicht - dann läge ich tatsächlich falsch

Aber selbst dann würde ich solch ein Konstrukt nur für sinnvoll halten, wenn ein Problem an der Stelle zumindest denkbar ist.

Delphi-Quellcode:
B := nil;
A := TMyClass.Create;
try
    B := TMyClass.Create; // wenn es hier knallt geht es nach finally weiter, die Überweisung wird aber nicht ausgeführt und keiner kriegt es mit
    EuroÜberweisenVonStahliZuHimi(B.Value);
finally
    A.Free;
    B.Free;
end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:58 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