Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Try-Finally und Try-Except zusammen nutzen? (https://www.delphipraxis.net/154794-try-finally-und-try-except-zusammen-nutzen.html)

himitsu 25. Sep 2010 18:25

AW: Try-Finally und Try-Except zusammen nutzen?
 
Ich nutz ja recht selten etwas ala "div by null",
aber als ich mich das letzte mal verschrieben hatte, da war's glaub ich auch das div (div 0 statt div 10 geschrieben).
Mir ist aber so, als wenn ich sowas auch mal mit einem / hatte :gruebel:

xZise 26. Sep 2010 16:03

AW: Try-Finally und Try-Except zusammen nutzen?
 
Soweit ich weiß, kann man eine Gleitkommazahl durch 0 teilen (das Ergebnis ist dann NaN).

Und naja, Java meckert ziemlich viel rum:
  • Code:
    int answer() {}
    Code:
    int answer() {
        if (Math.random() < 0.5) { return 0; }
    }
    missing return statement
  • Code:
    int answer() throws Exception { 
       throw new Exception();
       return 42;
    }
    unreachable statement

MfG
Fabian

Benmik 29. Sep 2020 11:23

AW: Try-Finally und Try-Except zusammen nutzen?
 
Hat sich hier eigentlich in den letzten 10 Jahren etwas getan? Ist in den nächsten 100 Jahren etwas zu erwarten?

Ich habe laufend Routinen, in denen sowohl Fehler abgefangen als auch Ressourcen freigegeben werden müssen. Dieses
Delphi-Quellcode:
Try
  Try
finde ich furchtbar, und man sieht es auch selten. Es soll auch einen Haufen Code erzeugen.
Was ist eigentlich damit, dürfte ein Profi sich sowas leisten, oder wäre sein Ruf dann dahin?
Delphi-Quellcode:
  Except
    Liste.Free;
    Stream.Free;
    Objekt.Free;
    Showmessage('Mist!');
    exit(False);
  end;
  Liste.Free;
  Stream.Free;
  Objekt.Free;
end;
Wenn es noch gestattet ist und nicht als OT angesehen wird, würde ich auch gern auf diesen Beitrag bei SO verweisen (selbstverständlich führt auch dort David Heffernan seine Klinge). Ich habe nämlich auch angefangen, sehr viele Prozeduren in Funktionen umzuwandeln, in denen der Wert über einen var-Parameter zurückgegeben wird und Result mitteilt, ob alles geklappt hat.
Delphi-Quellcode:
If BestimmeWert(var Wert:string) then ...
gefällt mir codetechnisch viel besser als
Delphi-Quellcode:
Wert := BestimmeWert;
If Wert <> '' then ...
.

haentschman 29. Sep 2020 11:35

AW: Try-Finally und Try-Except zusammen nutzen?
 
Hallöle...:P
Zitat:

Exit veranlasst die aufrufende Prozedur, mit der Anweisung nach dem Punkt fortzufahren, an dem die Prozedur aufgerufen wurde
http://docwiki.embarcadero.com/Libra...de/System.Exit
try/finally bewirkt das der Finally Block immer ausgeführt wird. Damit brauchst du die Freigaben nicht doppelt schreiben.
https://de.wikipedia.org/wiki/Don%E2...epeat_yourself

Benmik 29. Sep 2020 11:37

AW: Try-Finally und Try-Except zusammen nutzen?
 
Nein, schau doch noch mal hin ...
(zum Verständnis: haentschmanns Antwort ist nun nicht mehr, was sie mal war...)

haentschman 29. Sep 2020 11:43

AW: Try-Finally und Try-Except zusammen nutzen?
 
Zitat:

zum Verständnis: haentschmanns Antwort ist nun nicht mehr, was sie mal war
...wer kann denn schon ahnen, daß die Antwort gleich gelesen wird. :stupid: Ich hatte die ersten Freigaben übersehen und mich auf das EXIT konzentriert.:wink:

Benmik 29. Sep 2020 11:57

AW: Try-Finally und Try-Except zusammen nutzen?
 
Zitat:

Zitat von haentschman (Beitrag 1474511)
try/finally bewirkt das der Finally Block immer ausgeführt wird. Damit brauchst du die Freigaben nicht doppelt schreiben.

Na klar, die Freigabe klappt dann, aber die Exceptionbehandlung nicht mehr, das ist ja der Grund für das doppelte Try.

Aber jetzt anders, wie macht ihr das?
1. Doppeltes Try
2. Doppeltes Try umgehen
3. Zweite Variante doch wohl nicht, aber nur gefühlsmäßig, oder aus sachlichem Grund?

Delphi.Narium 29. Sep 2020 12:35

AW: Try-Finally und Try-Except zusammen nutzen?
 
Bevorzugt doppeltes Try.

Wenn möglich in Funktionen ausgelagert, die mir sagen, ob's erfolgreich war bzw. einen definierten Wert zurückgeben, mit dem ich garantiert weiter arbeiten kann.

Also ähnlich zu Deinem Beispiel mit Funktion und Var-Parametern.

Var-Parameter immer dann, wenn die Funktion mehr als einen Wert liefern muss oder im Fehlerfalle anders vorgegangen werden muss, als im Erfolgsfalle.

Also sowas:
Delphi-Quellcode:
if MeineFunktion(1..n Parameter) then begin
  // Weiterverarbeitung im Erfolgsfall.
end else begin
  // Weiterverarbeitung im Fehlerfall.
end;
// oder eben, Fehler in der Funktion werden vollständig behandelt und Rückgabewert ist für die Weiterverarbeitung geeignet.
Variabel := MeineFunktion(1..n Parameter);
In beiden Fällen gilt: Als Var-Parameter nur die, die auch verändert werden müssen, die übrigen als Const-Parameter.
Delphi-Quellcode:
function MeineFunktion(0..n Const-Parameter, 1..n Var-Parameter) : Boolean;
function MeineFunktion(1..n Const-Parameter) : BedarfsgerechterTyp;
Funtionen können als Rückgabewert ggfls. aber auch mal vom Typ "Record of wasauchimmer" sein, dann hat man zwar nur einen Rückgabewert, der kann aber als Record mehrere Werte enthalten ;-) (ist aber eher die Ausnahme, meist nur dann, wenn aus der Funktion irgendwas aufgerufen wird, was sowieso schon 'nen Record liefert.)

Benmik 29. Sep 2020 12:54

AW: Try-Finally und Try-Except zusammen nutzen?
 
Das wäre alles auch nach meinem Gusto (vielleicht ein bisschen außer dem doppelten Try). Angenehm zu wissen.

Aviator 29. Sep 2020 19:04

AW: Try-Finally und Try-Except zusammen nutzen?
 
Ich mache das auch mit einem doppelten
Delphi-Quellcode:
try
. Nur bin ich mir nie so sicher, wie die Reihenfolge am sinnvollsten ist.

So:
Delphi-Quellcode:
try
  obj := TObject.Create;
  try
    // Some code
  except
    // Exception handling
  end;
finally
  obj.Free;
end;
Oder doch so:
Delphi-Quellcode:
try
  obj := TObject.Create;
  try
    // Some code
  finally
    obj.Free;
  end;
except
  // Exception handling
end;
Ich würde ja fast sagen, dass die letztere Variante die sinnvollere sein müsste. Weil prinzipiell könnte es ja schon im Constructor des zu erzeugenden Objektes knallen. In der ersten Variante würde das dann nicht abgefangen werden.

Wie seht ihr das?

PS: Ich würde mir auch ein
Delphi-Quellcode:
try .. except .. finally
Konstrukt wie in C# wünschen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.
Seite 2 von 3     12 3      

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