Delphi-PRAXiS
Seite 1 von 3  1 23   

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)

OrNEC 25. Sep 2010 15:54

Delphi-Version: 7

Try-Finally und Try-Except zusammen nutzen?
 
Hallo, hab da eine Frage wo ich nicht weiter komme.
Ich schreibe wie folgt eine Datei:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini:=TIniFile.Create('C:\Test.ini');
  try
    {hier schreiben}
  finally
    Ini.Free;
  end;
end;
Was ist allerdings wenn sich mein Programm auf einer CD befindet wo es keine Schreibrechte gibt? Da, hab ich gelesen, ist besser Try-Except zu verwenden, aber wenn ich Finally durch Except ersetze wie gebe die Ini frei?

Danke!

Uwe Raabe 25. Sep 2010 15:56

AW: Try-Finally und Try-Except zusammen nutzen?
 
Delphi-Quellcode:
Ini := TIniFile.Create('C:\Test.ini');
try
  try
    {hier schreiben}
  except
    { hier die Exception aber auch behandeln! Bei Bedarf über raise weiterreichen. }
  end;
finally
  Ini.Free;
end;

OrNEC 25. Sep 2010 16:01

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

Ich dachte auch so ähnlich, war mir aber nicht sicher, ob das so gemacht wird, wollte nen Profi fragen. Also danke noch ma!

xZise 25. Sep 2010 16:08

AW: Try-Finally und Try-Except zusammen nutzen?
 
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

himitsu 25. Sep 2010 16:13

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

Zitat von xZise (Beitrag 1051859)
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. :cry:

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;

himitsu 25. Sep 2010 16:16

AW: Try-Finally und Try-Except zusammen nutzen?
 
[edit] *verklickt*

xZise 25. Sep 2010 16:54

AW: Try-Finally und Try-Except zusammen nutzen?
 
Moin himitsu,
Zitat:

Zitat von himitsu (Beitrag 1051862)
[...]sowas hätte mir auch gefallen[...]

Joar manchmal ganz nett. Und da könnte die Compiler magic auch das in das "alte" Format umwandeln.


Zitat:

Zitat von himitsu (Beitrag 1051862)
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

sx2008 25. Sep 2010 17:14

AW: Try-Finally und Try-Except zusammen nutzen?
 
Wenn man try..finally und try..except gemeinsam benötigt sollte man mal
über Unterfunktionen nachdenken.

In folgendem Beispiel werden Try..finally und try..except in verschiedenen
Methoden verwendet.
Der Code gewinnt dadurch an Klarheit und wird offener für zukünftige Veränderungen.
Delphi-Quellcode:
procedure TForm1.LoadIniFile(const filename:String);
var
  Ini : TIniFile;
begin
  Ini := TIniFile.Create(filename);
  try
  ...
  finally
    Ini.Free;
  end;
end;

procedure TForm1.LadeKonfig;
begin
  try
    LoadIniFile('myconfig.ini');
  except
    on E:Exception do
    begin
      E.Message := 'Konfiguration konnte nicht geladen werden'#13#10+
        E.Message;
      raise;
    end;
  end;
end;

himitsu 25. Sep 2010 17:17

AW: Try-Finally und Try-Except zusammen nutzen?
 
Schön, dann scheint es in Java wenigstens richtig behandelt zu werden. :-D


Aber sowas wie
Delphi-Quellcode:
int j = 2 / 0;
würde Delphi garnicht erst kompilieren :stupid:

rollstuhlfahrer 25. Sep 2010 18:01

AW: Try-Finally und Try-Except zusammen nutzen?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf