AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Try-Finally und Try-Except zusammen nutzen?
Thema durchsuchen
Ansicht
Themen-Optionen

Try-Finally und Try-Except zusammen nutzen?

Ein Thema von OrNEC · begonnen am 25. Sep 2010 · letzter Beitrag vom 30. Sep 2020
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

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

  Alt 25. Sep 2010, 15:08
Das ist der gängige Weg mit Delphi. In anderen Programmiersprachen hast du netterweise auch ein try-except-finally Konstrukt.

Zum Beispiel in Java:
Code:
try {

} catch (Exception e) {

} finally {

}
MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 25. Sep 2010, 15:13
Zum Beispiel in Java:
Code:
try {

} catch (Exception e) {

} finally {

}
Intern ist Try-Finally und Try-Except fast das Selbe, jedenfalls wird mit den selben Struckturen gearbeitet.

Das Problem ist aber, wenn in einem der Except/Finally-Blöcke eine Exception auftritt.
Darum braucht man eben 2 verschachtelte Schutzblöcke, Delphi baut sich sowas leider nicht selber zusammen.

sowas hätte mir auch gefallen
Delphi-Quellcode:
try

except

finally

end;
@xZise: Was passiert denn, wenn in Catch eine Exception auftritt?
Wird dann Finally noch ausgeführt?[/QUOTE]


Wierum man es letztendlich verschachtelt, hängt von der Aufgabe ab.
Delphi-Quellcode:
Ini := TIniFile.Create('C:\Test.ini');
try
  try
    ...
  except
    ...
  end;
finally
  Ini.Free;
end;
TIniFile greift im Constructor nicht auf die Datei zu, weswegen es hier geht.
TMemIniFile macht dieses aber, weshalb man es hier eventuell andersrum machen sollte, falls z.B. schon beim Öffnen/Auslesen ein Fehler auftritt.
Delphi-Quellcode:
try
  Ini := TMemIniFile.Create('C:\Test.ini');
  try
    ...
  finally
    Ini.Free;
  end;
except
  ...
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Sep 2010 um 15:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 25. Sep 2010, 15:16
[edit] *verklickt*
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Sep 2010 um 15:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 25. Sep 2010, 15:54
Moin himitsu,
[...]sowas hätte mir auch gefallen[...]
Joar manchmal ganz nett. Und da könnte die Compiler magic auch das in das "alte" Format umwandeln.


Delphi-Quellcode:
try

except

finally

end;
@xZise: Was passiert denn, wenn in Catch eine Exception auftritt?
Beurteile es selber:
Code:
C:\Users\xZise\Desktop\löschen>"C:\Program Files\Java\jdk1.6.0_21\bin\javac.exe"
 Main.java

C:\Users\xZise\Desktop\löschen>java Main
Throw an exception.
Exception caught. Throw another exception!
Now I'm in the finally block.
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:10)
Code:
public class Main {

    public static void main(String[] a) {
   
        try {
            System.out.println("Throw an exception.");
            int i = 2 / 0;
        } catch (Exception e) {
            System.out.println("Exception caught. Throw another exception!");
            int j = 2 / 0;
        } finally {
            System.out.println("Now I'm in the finally block.");
        }
        System.out.println("Good bye.");
    }

}
MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 25. Sep 2010, 16:17
Schön, dann scheint es in Java wenigstens richtig behandelt zu werden.


Aber sowas wie int j = 2 / 0; würde Delphi garnicht erst kompilieren
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 25. Sep 2010, 17:01
nun ja, Delphi macht da einiges mit:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Extended;
  j, k: Integer;
begin
// 1
ShowMessage(Format('%1.4f', [(5/0)]));

// 2
ShowMessage(FloatToStr(5/0));

// 3
i := 5/0;
ShowMessage(FloatToStr(i));

// 4
j := Trunc(5/0);
ShowMessage(IntToStr(j));

// 5
k := 5 div 0;
ShowMessage(IntToStr(k));
end;
Mit den beiden Zeilen, die mit 1, 2 und 3 beschriftet sind, hat Delphi absolut keine Probleme. Bei Zeile mit 4 meckert es mit "Konstantenausdruck verletzt untere Grenze" und erst bei der Zeile mit 5 bemerkt es, dass das jetzt schon wieder eine Division durch 0 ist und zeigt einen entsprechenden Fehler an.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 25. Sep 2010, 18:25
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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

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

  Alt 26. Sep 2010, 16:03
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 29. Sep 2020, 11:23
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. If BestimmeWert(var Wert:string) then ... gefällt mir codetechnisch viel besser als
Delphi-Quellcode:
Wert := BestimmeWert;
If Wert <> 'then ...
.

Geändert von Benmik (29. Sep 2020 um 11:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:24 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