AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"FinalllyExit" gewünscht

Ein Thema von stahli · begonnen am 30. Apr 2011 · letzter Beitrag vom 21. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von stahli
stahli
Online

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

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 11:48
Na ja, grundsätzlich sind mir die Fehlerbehandlungen schon klar.

Nur, wenn es irgendwo knallt, ist es m.E. zweitrangig, ein erzeugtes Objekt auch wieder frei zu geben.
Jedenfalls nicht, wenn nicht innerhalb der Fehlerbehandlung selbst wieder ein konstistenter Projektzustand hergestellt wird.

Wenn Exit in einem Try-Block in finally springt, ist das schon mal eine Lösung, aber nicht wirklich das, was ich erwartet habe.

Mal ein Beispiel (ungetestet, nur Resultat Eurer Erklärungen):

Delphi-Quellcode:
function MyFunc: Real;
var
  O: TMyObject;
begin
  O := TMyObject.Create;
  try
    O.DoA;
    if O.A then
      Exit(-1); // ist kein Exit sondern springt in finally - DoNotIfExitBefore wird noch bearbeitet, das wäre ohne Try-Block nicht der Fall, da würde die Funktion VERLASSEN
    O.DoB;
    Result := 1 / 0; // Exception -> Sprung nach finally
    O.DoC;
    Result := O.Result;
  finally
    O.Free;
  end;
  DoNotIfExitBefore; // wird trotz EXIT ausgeführt
end;

Nach Eurer Beschreibung reagiert Exit nicht mehr "normal", wenn man es (z.B. nachträglich) in einen Try-Block kapselt.
Zumindest muss man darauf wohl unbedingt achten, da Exit dann nicht wirklich die Funktion verlässt.

Manchmal möchte man ja eine Funktion unter bestimmten Bedingungen gar nicht ausführen. Wenn man dann das Exit in ein Try-Block aufnimmt, nach dessem finally-end noch etwas ausgeführt wird, dann funktioniert das Exit nicht erwartungsgemäß.

Und zur Objektfreigabe: Wenn im obigen Fall O.DoC nicht mehr ausgeführt wird und man den Fehler nachträglich nicht (durch eine Neuberechnung o.ä. korrigiert) bringt einen die Objektfreigabe auch nicht wirklich weiter. Das Projekt arbeitet fehlerhaft bzw. nicht zuverlässig. Der Fehler muss UNBEDINGT bereinigt werden, aber die Freigabe des Objektes finde ich im Fehlerfall mindestens nachranging.
Ob das Objekt nun aufgelöst wird oder nicht - das Programm beinhaltet fehlerhafte Daten. Die Funktion muss angepasst werden und eine "drohende" Division durch Null selbständig behandeln.

Aber ich schaue mir die ganze Try-Geschichte natürlich nochmal an.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 11:53
Zur not könntest du dich mit einer Hilfsvariable, die du sagen wir nach dem Exit Befehl auf true setzt aus der Afäre ziehen. Dann checkst du nach dem finally, ob die Variable gesetzt ist und führst nur dann eventuelle weitere Funktionen aus. Guter Stil ist das denke ich allerdings nicht ..
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 12:03
Nur, wenn es irgendwo knallt, ist es m.E. zweitrangig, ein erzeugtes Objekt auch wieder frei zu geben.

[...]

... bringt einen die Objektfreigabe auch nicht wirklich weiter. Das Projekt arbeitet fehlerhaft bzw. nicht zuverlässig. Der Fehler muss UNBEDINGT bereinigt werden, aber die Freigabe des Objektes finde ich im Fehlerfall mindestens nachranging.
Ob das Objekt nun aufgelöst wird oder nicht - das Programm beinhaltet fehlerhafte Daten.
Naja, so kann man das nicht sagen. Nimm an, es geht um einen Filestream und du möchtest Daten speichern. Ohne Exceptionhandling. Es tritt ein Fehler auf, der an den benutzer weitergegeben wird - z.B. weil in den Daten ein Fehler drin ist. Er korrigiert den Fehler, will wieder speichern und es geht wieder nicht, weil die Datei noch vom letzten Mal geöffnet ist - der Filestream wurde ja nicht freigegeben!

Ein Speicherleck ist zwar nicht schön aber RAM ist meistens genug da. Wenn andere Ressourcen nicht freigegeben werden, kann es schon ärgerlicher werden. Und genau dafür hat man ja try-finally
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 11:54
Zitat:
// wird trotz EXIT ausgeführt
Nur wenn vorher keine Exception auftrat.

Exit springt aus der Prozedur, aber vorher werden noch die Finally-Abschnitte der umgebenden Try-Finally abgearbeitet.


Bei Try-Except wird, wenn in dem Except-Teil keine neue Exceptions ausgelöst oder die alte Exception weitergeeicht wird, der nachfolgende Code ausgeführt, da die Exception ja abgefangen wurde.

Zitat:
Der Fehler muss UNBEDINGT bereinigt werden
Und dafür ist Try-Finally/Except da, daß man auf "Außnahmen" reagieren kann und dieses entsprechend behandelt.
Dieses kann aber auch bedeuten, daß man noch schnell eine ordentliche Fehlermeldung ausgibt und dann das Programm gezielt und ordnungsgemäß beendet.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Apr 2011 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

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

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 11:59
Ok, das (finally und DANN exit) hört sich sehr gut an. Ich schaue mir das wie gesagt noch genau an.

Danke!


PS: In meinem Beispiel ist natürlich klar, dass O vor dem Exit freizugeben wäre. Da war ich etwas zu hektisch. Sorry.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 12:07
Ok, das (finally und DANN exit) hört sich sehr gut an. Ich schaue mir das wie gesagt noch genau an.
Ähm, dann werden die folgenden Befehle nicht mehr ausgeführt, da der finally Block unbedingt ausgeführt wird und ein Exit dort veranlasst das Verlassen der Funktion. Dh. es kommt nie zu einem:
DoNotIfExitBefore
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.055 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 12:12
Mag nur meine Meinung, aber für jedes Exit sollte es einen Schlag in den Nacken geben.
Klar, an manchen Stellen kann man sich in etwas vertrackten Konstrukten einfach aus der Affaire ziehen, aber sauber gecoded ist es zu 99.99% vermeidbar.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 12:16
@Stevie: Danke, genau diese Worte habe ich mir beim Lesen dieses Themas gewünscht
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 12:49
Mag nur meine Meinung, aber für jedes Exit sollte es einen Schlag in den Nacken geben.
Klar, an manchen Stellen kann man sich in etwas vertrackten Konstrukten einfach aus der Affaire ziehen, aber sauber gecoded ist es zu 99.99% vermeidbar.
Ähm, ja, ich hab das auch die meiste Zeit gedacht, aber um den Code kürzer zu halten, ist es wirklich sinnvoll, hier und da mal Exit zu verwenden.
Ein Beispiel:

Delphi-Quellcode:
// mit Exit
begin
  if not FileExists(Filename) then Exit;
  LoadFile();
  ProcessFile();
  DoSomethingElseWithFile();
end;

// ohne Exit
begin
  if FileExists(Filename) then
  begin // extra Zeile
// + Verschachtelung
    LoadFile();
    ProcessFile();
    DoSomethingElseWithFile();
  end; // extra Zeile
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

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

AW: "FinalllyExit" gewünscht

  Alt 30. Apr 2011, 12:55
Mag nur meine Meinung, aber für jedes Exit sollte es einen Schlag in den Nacken geben.
Klar, an manchen Stellen kann man sich in etwas vertrackten Konstrukten einfach aus der Affaire ziehen, aber sauber gecoded ist es zu 99.99% vermeidbar.
Ähm, ja, ich hab das auch die meiste Zeit gedacht, aber um den Code kürzer zu halten, ist es wirklich sinnvoll, hier und da mal Exit zu verwenden.
Ein Beispiel:

Delphi-Quellcode:
// mit Exit
begin
  if not FileExists(Filename) then Exit;
  LoadFile();
  ProcessFile();
  DoSomethingElseWithFile();
end;

// ohne Exit
begin
  if FileExists(Filename) then
  begin // extra Zeile
// + Verschachtelung
    LoadFile();
    ProcessFile();
    DoSomethingElseWithFile();
  end; // extra Zeile
Sehe ich auch so. Der Code wird u.U. einfach kürzer und übersichtlicher.
Zumal man mit Exit(Value) in Funktionen auch gleich einen Result-Wert zuweisen kann.
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 16:47 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