![]() |
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:
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?
procedure TForm1.FormClose(Sender: TObject);
var Ini: TIniFile; begin Ini:=TIniFile.Create('C:\Test.ini'); try {hier schreiben} finally Ini.Free; end; end; Danke! |
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; |
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! |
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:
MfG
try {
} catch (Exception e) { } finally { } Fabian |
AW: Try-Finally und Try-Except zusammen nutzen?
Zitat:
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:
@xZise: Was passiert denn, wenn in Catch eine Exception auftritt?
try
except finally end; Wird dann Finally noch ausgeführt?[/QUOTE] Wierum man es letztendlich verschachtelt, hängt von der Aufgabe ab.
Delphi-Quellcode:
TIniFile greift im Constructor nicht auf die Datei zu, weswegen es hier geht.
Ini := TIniFile.Create('C:\Test.ini');
try try ... except ... end; finally Ini.Free; end; 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; |
AW: Try-Finally und Try-Except zusammen nutzen?
[edit] *verklickt*
|
AW: Try-Finally und Try-Except zusammen nutzen?
Moin himitsu,
Zitat:
Zitat:
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:
MfG
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."); } } Fabian |
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; |
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:
würde Delphi garnicht erst kompilieren :stupid:
int j = 2 / 0;
|
AW: Try-Finally und Try-Except zusammen nutzen?
nun ja, Delphi macht da einiges mit:
Delphi-Quellcode:
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.
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; Bernhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17: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 by Thomas Breitkreuz