![]() |
Dateien und Exceptions
Hallo,
trotz einiger Tutorials, komme ich mit Dateien & Exceptions nicht klar. z.B. ich möchte eine Datei einlesen. Wie schachtele ich da try.. except & try.. finally ?
Delphi-Quellcode:
im Programm
procedure DateiEinlesen(Pfad: String; var Datensatz: String);
begin AssignFile(Datei,Pfad); try try Reset(Datei); read(Datei, Datensatz); except showmessage('fehler beim lesen'); end; closeFile(Datei); //sollte ich das nicht lieber mit try..finally behandeln? wo? wie kann ich das ganze sinnvoll schachteln? except showmessage('Kann Datei nicht öffnen'); end; end;
Delphi-Quellcode:
zu (*1) Wenn in DateiEinlesen Fehler aufgetreten sind, dann hat Inhalt evtl. keinen vernünftigen 'Inhalt'? Sollte ich daher DateiEinlesen als Funktion deklarieren mit einem booleschen Rückgabewert oder wird sowas auch durch exceptions verhindert?
DateiEinlesen(Dateipfad, Inhalt);
DoSomething(Inhalt); //(*1) Danke :) |
Re: Dateien und Exceptions
Delphi-Quellcode:
So geht es ohne Exceptions und try-finally.
Assignfile(F, Filename);
{$I-} Reset(F); if IOResult = 0 then begin // was mit Datei machen end else ShowMessage('Fehler beim Öffnen der Datei.'); CloseFile(F); {$I+} |
Re: Dateien und Exceptions
Danke Luckie :) , ich muss es aber lt. Aufgabenstellung mit Exceptions machen :( .
Diese Compiler-Schalter {I+} bzw {I-} .. muss man die immer IN der Prozedur schreiben oder gilt es für alle Prozedur/Funktionen in der Unit, wenn man es direkt unter implementation schreibt? |
Re: Dateien und Exceptions
Hallo SiouX,
sieh Dir mal in der Delphi-Hilfe TFileStream an oder gleich ![]() Yo, ansonsten machst Du das schon ganz gut, bis auf eine Kleinigkeit:
Delphi-Quellcode:
Greetz DANNYBOY
procedure DateiEinlesen(Pfad: String; var Datensatz: String);
begin AssignFile(Datei,Pfad); try Reset(Datei); read(Datei, Datensatz); except showmessage('fehler beim lesen'); end; // anderer Fehler möglich, ergo anderer TryBlock try closeFile(Datei); except showmessage('Kann Datei nicht öffnen'); end; end; |
Re: Dateien und Exceptions
@Dannyboy
hmm.. was für ein Fehler z.b.? Ob die Datei formal korrekt ist (existiert, Endung, Größe) prüfe ich vorher oder meinst du ganz was anderes? |
Re: Dateien und Exceptions
Bei meinem oberen Try-Except werden Lesefehler abgefangen und beim
unteren ein eventueller Fehler beim Schließen (ist mir allerdings noch nie passiert). Dein Beispiel macht inhaltlich exakt das Selbe, nur wenn Du Deine Routinen noch weiter ausbaust und dann mehrere dieser Try-Except Blöcke hast, dann würde ich sie wegen der Übersicht nicht schachteln, sondern sequentiell unter einander schreiben. Zu Deiner anfänglichen Frage: Ein Finally wird auf jeden Fall ausgeführt, also auch im Falle eines Fehlers, deswegen kommt das in Deinem Beispiel nicht in Frage. Wenn die Datei nicht geöffnet werden kann, dann soll sie NICHT geschlossen werden (da sie bereits geschlossen ist), ergo Except. Wie Luckie aber schon sagte: Die Try-Catch-Blöcke sind in diesem Beispiel optional, wenn Du die Compilermeldungen mit {$I-} und {$I+} ausschaltest. Mit Filestreams ist das alles leichter. Ich komme auch aus der Pascal-Ecke und habe mich anfangs davor gescheut, aber das ist meines Erachtens noch einfacher als das Verarbeiten von Dateien mit den Pascal-Routinen |
Re: Dateien und Exceptions
Hi,
ich habe ein ähnliches Problem... mit folgendem Code arbeite ich...
Delphi-Quellcode:
Das funktioniert auch ganz gut, aber aber wenn die Datei schreibgeschützt ist, gibt es eine Exception ("Zugriff verweigert"). Warum?! AssignFile setzt doch eh nur ReadOnly oder wie sehe ich das ?!
Procedure TFrmMain.Suchen();
Var I, Posi: Integer; Datei: File Of Byte; Begin For I := 1 To lstAllFiles.Items.Count - 1 Do Begin AssignFile(Datei, LstAllFiles.Items[I]); Reset(Datei); [...] DateiSize.Add(IntToStr(FileSize(Datei))); CloseFile(Datei); End; End; Beste Grüsse und frohe Ostern, Ricane |
Re: Dateien und Exceptions
Moin Ricane,
AssignFile ist borlandspezifisch und macht eigentlich nicht mehr als, als intern eine Zuordnung zwischen der File Variablen und dem Dateipfad herzustellen. Entscheidend ist hier Reset, denn diese Prozedure verwendet zum Öffnen der Datei den Modus, der in der Variablen FileMode gespeichert ist. Dies ist standardmässig Read/Write, so dass der Zugriff auf eine schreibgeschützte Datei fehlschlagen muss. Du müsstest nur die FileMode Variable auf fmOpenRead setzen, bevor Reset aufgerufen wird. Dann sollte es funktionieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 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