Delphi-PRAXiS
Seite 7 von 7   « Erste     567

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   "FinalllyExit" gewünscht (https://www.delphipraxis.net/160164-finalllyexit-gewuenscht.html)

himitsu 20. Mai 2011 07:42

AW: "FinalllyExit" gewünscht
 
Zitat:

versuchsweise ausführen
Logiksteuerung via Exceptions ist in der Regel eh verpöhnt.

Try-Finally/Except ist für den "Notfall" ... Exception = Ausnahme

Zitat:

Zitat von FredlFesl (Beitrag 1101911)
Ein Konstruktor sollte doch niemals eine Exception werfen. Und wenn, braucht man das Objekt nicht freizugeben, weil die Konstruktorlogik den Speicher selbst wieder freigibt, bevor sie die Exception erneut schmeisst.

Das stimmt schon, aber
Delphi-Quellcode:
A := TA.Create;
B := TB.Create;
try
Knallt es hier im B, dann gibt sich B selber wieder frei .... nur um das A kümmert sich keiner mehr.

PS: Ja, beim Erstellen und wärend der Bearbeitung sind A und B hier abgesichert, aber
Delphi-Quellcode:
finally
  A.Free;
  B.Free;
end;
Knallt es jetzt im A.Free, dann wird B nicht freigegeben.
Der einzige Grund, warum diese Vereinfachung "oft" Funktional ist, liegt darin begründet, daß das Free oftmals "weniger" Probleme bereitet.
Ist das nicht sichergestellt, dann kommt man um verschachtelte Try-Finally nicht drumrum.
Es sei denn man weiß, daß z.B. A.Free (nahezu) niemals Exceptions werfen kann, dann ist auch B.Free mit großer Sicherheit noch geschützt.

Ich selber nutze eine derartige Kombination vorallem dann, wenn ich eben weiß, daß A.Free problemlos abläuft und für den Fall, daß es da doch mal knallt, dann ist der Programmablauf eh dermaßen gestört, daß das Programm beendet werden muß und sich keine weitere Absicherung mehr lohnt.

Und ja, an Stellen wo sich keine Fehlerbehandlung "lohnt", weil dann eh nix mehr geht, dann erspare ich mir auch schonmal eine Exceptionbehandlung, wie Try-Finally und selbst Speicherfreigaben werden schonmal einfach weggelassen. (weil dadurch der Programmcode schonmal übersichtlicher/kürzer werden kann, ohne das es probleme gibt, da ich weiß das sich Windows am Programmende auch um vieles nochmal kümmert ... das war vor der NT-Reihe noch wesentlich aufwändiger/wichtiger)

stahli 20. Mai 2011 09:04

AW: "FinalllyExit" gewünscht
 
Zitat:

Zitat von himitsu (Beitrag 1101916)
Der einzige Grund, warum diese Vereinfachung "oft" Funktional ist, liegt darin begründet, daß das Free oftmals "weniger" Probleme bereitet.
Ist das nicht sichergestellt, dann kommt man um verschachtelte Try-Finally nicht drumrum.
Es sei denn man weiß, daß z.B. A.Free (nahezu) niemals Exceptions werfen kann, dann ist auch B.Free mit großer Sicherheit noch geschützt.

Ich selber nutze eine derartige Kombination vorallem dann, wenn ich eben weiß, daß A.Free problemlos abläuft und für den Fall, daß es da doch mal knallt, dann ist der Programmablauf eh dermaßen gestört, daß das Programm beendet werden muß und sich keine weitere Absicherung mehr lohnt.

Und ja, an Stellen wo sich keine Fehlerbehandlung "lohnt", weil dann eh nix mehr geht, dann erspare ich mir auch schonmal eine Exceptionbehandlung, wie Try-Finally und selbst Speicherfreigaben werden schonmal einfach weggelassen. (weil dadurch der Programmcode schonmal übersichtlicher/kürzer werden kann, ohne das es probleme gibt, da ich weiß das sich Windows am Programmende auch um vieles nochmal kümmert ... das war vor der NT-Reihe noch wesentlich aufwändiger/wichtiger)

:thumb: Genau so sehe ich das auch - aber eben auch für eine gesamte Methode. Wenn ich diese ausgiebig getestet habe und sicher bin, dass alles korrekt funktioniert (außer, wenn vielleicht der Hauptspeicher defekt ist o.ä.) dann kann ich auf solche Absicherungen auch verzichten, die eben aus meiner Sicht auch nur einen begrenzten Nutzen haben. Das Programm funktioniert ohnehin nicht mehr korrekt und der Fehler muss gefunden und beseitigt werden.

FredlFesl 20. Mai 2011 18:20

AW: "FinalllyExit" gewünscht
 
[QUOTE=himitsu;1101916]
Zitat:

PS: Ja, beim Erstellen und wärend der Bearbeitung sind A und B hier abgesichert, aber
Delphi-Quellcode:
finally
  A.Free;
  B.Free;
end;
Knallt es jetzt im A.Free, dann wird B nicht freigegeben.
Jo, sowas ist ja auch extrem unsauber, gelle?
Zitat:

Es sei denn man weiß, daß z.B. A.Free (nahezu) niemals Exceptions werfen kann, dann ist auch B.Free mit großer Sicherheit noch geschützt.
Wenn es im Destruktor knallt, ist's doch eh zu spät. Dann benötigt die Schädelvorderseite eine intensive Holzbrettbehandlung.

Sunlight7 21. Mai 2011 11:39

AW: "FinalllyExit" gewünscht
 
Zitat:

Zitat von jfheins (Beitrag 1097822)
Falls du das nicht glaubst, zeige bitte ein Stück Code wo das finally nicht ausgeführt wird ;)

Code:
try
   Halt;
finally
   Beep;
end;
:lol:

himitsu 21. Mai 2011 11:45

AW: "FinalllyExit" gewünscht
 
Halt ist eine Ausnahme, denn dieses "schießt" das Programm direkt ab, genau da wo es ist,
das ist praktisch das selbe Ergebnis, als wenn man die Anwendung im Taskmanager abschießt.

Darum sollte man auch möglichst darauf verzichten.

Stevie 21. Mai 2011 14:24

AW: "FinalllyExit" gewünscht
 
Ihr verlagert das Problem nur noch.... wenn im Konstruktor oder Destruktor eine Exception auftritt... Welche Art Exception? Programmierfehler? Sollte dann das Programm dafür sorgen, dass der ausgebügelt wird oder still und heimlich trotzdem weiterlaufen? Oder sollte man, wenn es zu erwarten ist, dass ein Fehler auftreten kann (z.b. man versucht eine Datei zu öffnen), nicht innerhalb der Methode mit try except arbeiten und somit letztlich sichergehen, dass der Aufruf des Konstruktors fehlerfrei abläuft? Ehrlich, wenn ich bei jedem Create und Free dafür sorgen müsste, dass ich mögliche Exceptions abhandle, hätt ich mich schon erhängt. Übrigens gibt's auch sowas, wie Unittests...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:53 Uhr.
Seite 7 von 7   « Erste     567

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