Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu mehreren Try's (https://www.delphipraxis.net/71755-frage-zu-mehreren-trys.html)

Stefan Hueg 20. Jun 2006 17:06


Frage zu mehreren Try's
 
Ich stehe nun vor folgendem Problem, konnte bisher keine befriedigende Antwort dazu finden.

Szenario:
Ich will eine Ini-Datei öffnen, aus ihr irgendwas lesen und diese dann wieder freigeben. Falls währenddessen irgend ein Fehler auftritt soll eine Fehlermeldung ausgegeben werden.

Nun, eigtl. nicht schwierig. Aber es gibt mehrere Lösungsansätze und ich würde gerne wissen welcher der eleganteste bzw. Optimalste ist.

Beispiel 1:
Delphi-Quellcode:
procedure LoadIni(Filename: String);
var
  FileSettings: TIniFile;
  Test: String;
begin
  try
    try
      FileSettings := TIniFile.Create(Filename);
      Test := FileSettings.ReadString('Test', 'Test', 'Test');
    except on E: Exception do
      ShowMessage('Fehler');
    end;
  finally
    FileSettings.Free;
  end;
end;
Beispiel 2:
Delphi-Quellcode:
procedure LoadIni(Filename: String);
var
  FileSettings: TIniFile;
  Test: String;
begin
  try
    FileSettings := TIniFile.Create(Filename);
    Test := FileSettings.ReadString('Test', 'Test', 'Test');
    FileSettings.Free;
  except on E: Exception do begin
    ShowMessage('Fehler');
    FileSettings.Free;
  end;
  end;
end;
Mein Problem dabei ist dass ich nicht weiss ob man einfach so mehrere Try's schachteln kann. Habe irgendwo mal gelesen dass der Compiler für jeden Codeblock bei einem Try quasi einen "Ausweichcode" für den Fehlerfall anlegt, und das währen ja dann mehrere.

Die zweite Möglichkeit ist weit weniger elegant. Bitte klärt mich auf ^^

mkinzler 20. Jun 2006 17:12

Re: Frage zu mehreren Try's
 
Warum eigentlich 2 mal try eines würde doch reichen.

Delphi-Quellcode:
try
  ...
except
  on ...
finally
 ...
end;

Stefan Hueg 20. Jun 2006 17:13

Re: Frage zu mehreren Try's
 
Das funktioniert? Schande über mein Haupt....nu programmiere ich schon so lange mit Delphi und weiss das nicht....wieder was dazu gelernt...mal probieren ^^

SirThornberry 20. Jun 2006 17:16

Re: Frage zu mehreren Try's
 
die erste Variante ist völlig falsch denn du würdest filesettings auch mit Free versuchen frei zu geben wenn das Create schon fehlschlägt. Wenn das Create aber fehlschlägt ist nix frei zu geben. Und da die Variable lokal ist, ist sie auch nicht nil so das Free einen Fehler verursacht weil du es auf einen Speicherbereich anwendest wo gar kein Object liegt.

Stefan Hueg 20. Jun 2006 17:19

Re: Frage zu mehreren Try's
 
Der Quellcode:

Delphi-Quellcode:
try
  SettingFile := TIniFile.Create(ExtractFilePath(ParamStr(0))+ 'settings.ini');
except
  on E: Exception do
    ShowMessage('Fehler');
finally
  SettingFile.Free;
end;
funktioniert nicht. Mein Compiler muckt da rum.

@SirThornberry:
Also

Delphi-Quellcode:
try
  SettingFile := TIniFile.Create(ExtractFilePath(ParamStr(0))+ 'settings.ini');
finally
  SettingFile.Free;
end;
Sollte man nicht verwenden da nicht sichergestellt ist dass Create überhaupt erfolgreich war, habe ich das richtig verstanden?

SirThornberry 20. Jun 2006 17:28

Re: Frage zu mehreren Try's
 
genau, das Free soll ja nur ausgeführt werden wenn das Create erfolgreich war und somit auch speicher zum freigeben vorhanden ist.

DGL-luke 20. Jun 2006 17:32

Re: Frage zu mehreren Try's
 
Also ich stelle das create immer vor den ressourcenschutzblock.

Stefan Hueg 20. Jun 2006 18:04

Re: Frage zu mehreren Try's
 
Ok ich glaube ihr versteht noch nicht so recht was ich erreichen will ^^

Anderes Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Test: TIniFile;
begin
  try
    Test := TIniFile.Create('C:\test.txt');
    Test.WriteString('Test', 'Test', 'Test');
    Test.Free;
  except
    on EIniFileException do
      ShowMessage('Fehler bei Ini-File');
  else
    ShowMessage('Irgend ein anderer Fehler');
  end;
end;
Wenn das Objekt erstellt, in die Ini-Datei geschrieben werden konnte: Kein Problem
Aber tritt bei WriteString beispielsweise ein Fehler auf, weil die Datei schreibgeschützt ist beispielsweise, wird das Objekt gar nicht mehr freigegeben, obwohl es erfolgreich erstellt wurde.

Ich müsste nun irgendwie herausfinden ob das Objekt erfolgreich erstellt wurde, dann kann ich sicher sagen dass ich es auch freigeben kann.

Khabarakh 20. Jun 2006 18:05

Re: Frage zu mehreren Try's
 
Ein Post über deinem steht die Lösung.

DGL-luke 20. Jun 2006 18:11

Re: Frage zu mehreren Try's
 
*sich von Khabarakh bestätigt sieht*

Ein Ressourcenschutzblock sieht (bei mir) so aus:

Delphi-Quellcode:
objekt := TObjekt.Create;
try
  objekt.dosomething;
  objekt.accessfragilethings;
finally
  objekt.Free;
end;
;)

(für ein zusätzliches except muss man tatsächlich schachteln! Zumindest bei D2005PE)


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

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