[erledigt] Datei Speichern absichern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

[erledigt] Datei Speichern absichern

Beitrag von NoCee »

Hallo zusammen,

ich zeichne Daten einer Maschine in einem Logfile auf.
Strings mit um die 30 Byte werden an eine CSV-Datei angehängt.
Funktioniert seit Jahren einwandfrei. Vor einer Weile hat unsere IT den Speicherpfad
von einem hausinternen Speicher nach irgendwo extern, vielleicht in die Cloud, gehängt.
Seit dem ist das Netzlaufwerk ein bisschen wackelig. Gelegentlich schließt sich mal der Dateimanager einfach so
und es dauert kurz bevor ich den Speicherort wieder öffnen kann.
Meine einfach gestrickte Software stürzt jetzt gelegentlich ab. Fehlermeldung in der Konsole "Zugriff verweigert"
Die einzige Sicherheit die ich eingebaut habe ist die Überprüfung ob die Datei existiert also noch nichts mit try-finally usw.

Wie geht man hier sinnvoll vor damit das nicht passiert um auch die aktuellen Daten nicht zu verlieren?
Ich vermute mal das in ein try Konstrukt zu packen, krieg ich hin, aber was ist zu tun wenns nicht geklappt hat?
In eine temporäre Datei zwischenspeichern? Im Ram halten, sind nicht viele Daten, und mit einem Timer später noch mal versuchen?

Läuft derzeit auf einer virtuellen Windowsmaschine.
Eine zweite gleiche Software speichert parallel auf einem lokalem Laufwerk damit die Daten nicht weg sind und hier gibts keine Probleme.

Hat jemand Tipps für mich wie man da vorgeht?
Vielen Dank schon mal im Voraus

Gruß NoCee
Zuletzt geändert von NoCee am Mi 27. Mär 2024, 09:39, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Datei Speichern absichern

Beitrag von af0815 »

Lokal zwischenspeichern. Und dann Übertragen ist noch immer die sicherste Seite. Das mit dem umstellen auf die Cloud ist zwar IT Stand der Technik, dann aber eine stabile Verbindung zu haben Stand nicht im Lastenheft. Ist überall so und wenn man Maschinenbaumässig in 10 Jahresschritten denkt ist man ein Spinner.

Erfahrung sagt, immer lokal im selben Netzwerksegment puffern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Datei Speichern absichern

Beitrag von NoCee »

Hallo,

hab mich an den Rat gehalten und speichere lokal und einmal am Tag
wird die Datei komplett kopiert.

Ich wollte aber mal das Thema try..except angehen.
Damit hab ich noch nie was gemacht.
Erstmal wurde ich mal ordentlich vom Debugger hinters Licht geführt
weil mein except nie ausgeführt wurde. Hab dann im Netz gelesen daß das mit Debugger
nicht funktioniert weil dieser immer zuerst zuschlägt. Muß man wissen.

Das hier stammt von hier: https://www.delphi-treff.de/tipps-trick ... speichern/

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  F: File of TDatensatz;
begin
  try
    AssignFile(F,'C:Variable.dat');
    ReWrite(F);
    Write(F,Datensatz);
  finally
    CloseFile(F);
  end;
end;
Was mir nicht ganz klar ist, wenn ReWrite(F) in die Hose geht, ist die Datei doch nicht auf.
Warum steht dann CloseFile(F) da?
Außerdem heißt es bei der Beschreibung von finally daß das immer ausgeführt wird.
Warum brauch ich das finally dann? Ich könnte CloseFile(F) ja gleich hinter das end schreiben,
das wird dann ja auch immer ausgeführt.
Dann noch ne Frage: Was passiert wenn CloseFile(F) selber eine exception auslöst?
Oder wird das noch weil vor dem "end" auch geschützt und abgefangen?

Für eine kleine Erklärung wäre ich dankbar
Gruß
NoCee

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Datei Speichern absichern

Beitrag von wp_xyz »

NoCee hat geschrieben:
Fr 22. Mär 2024, 16:23
Warum brauch ich das finally dann? Ich könnte CloseFile(F) ja gleich hinter das end schreiben,
das wird dann ja auch immer ausgeführt.
Du meinst das "end" des "try-finally"-Blocks? Steht CloseFile(F) hinter diesem "end", wird es nicht ausgeführt, wenn irgendwo zwischen "try" und "finally" eine Exception auftritt. Dann dann wird die aktuelle Prozedur sofort verlassen; bei Anwesenheit eines "finally"-Abschnitts wird vorher aber noch der Code zwischen "finally" und "end" ausgeführt.

Folgendes Beispiel: es werden zwei Zahlen durcheinander dividiert, die im Nenner ist natürlich 0, so dass dabei eine Exception auftritt. Da das ganze im Zusammenhang mit einer länger dauernden Rechnung stehen soll, wird vorher der Screen.Cursor auf crHourglas gesetzt, und am Ende soll er wieder zurückgestellt werden.

Erstes Beispiel:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c: Double;
begin
  Screen.Cursor := crHourglass;
  try
    // hier: lange Rechnung
    a := 1.0;
    b := 0.0;
    c := a/b;
    // hier: noch eine lange Rechnung
  finally
    Caption := 'finally';
  end;
  Screen.Cursor := crDefault;
end; 
Vor der Rechnung, die in einem try-finally-Block steht, wird der Cursor auf crHourglass gesetzt, und danach auf crDefault zurück; das Zurücksetzen erfolgt, wie du fragst, NACH dem "end". Im "finally"-Block selbst wird das Wort "finally" in die Caption des Formular geschrieben, um zu demonstrieren, dass "finally" ausgeführt wurde. Wenn dieses Programm läuft und man klickt auf den Button, wird die Exception ausgelöst, und wenn man die Exception-Meldungen bestätigt, und danach die Maus über das Formular bewegt, sieht man immer noch den "Sanduhr-Kreisel"; in der caption steht "finally". Also hat das Programm den "finally"-Block erreicht, aber beim "end" die Prozedur verlassen, so dass der Cursor nicht zurückgesetzt wurde.

Zweites Beispiel:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c: Double;
begin
  Screen.Cursor := crHourglass;
  try
    a := 1.0;
    b := 0.0;
    c := a/b;
  finally
    Screen.Cursor := crDefault;
    Caption := 'finally';
  end;
end; 
Nun steht das Zurücksetzen des Cursors im "finally"-Block - und das Programm funktioniert wie es soll: Die Exception tritt auf und wird mit einer Meldung angezeigt, und dann steht "finally" in der Caption und der Cursor ist wieder normal.

Drittes Beispiel, nun ohne Exception, aber wir nehmen an, dass in der Rechnung zwischen "try" und "finally" etwas geschieht, so dass sich eine weitere Rechnung erübrigt und die Prozedur mit "exit" verlassen werden kann. Was passiert mit dem Cursor?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c: Double;
begin
  Screen.Cursor := crHourglass;
  try
    a := 1.0;
    b := 1.0;
    c := a/b;
    exit;
    // Hier eine lange Rechnung  
  finally
    Screen.Cursor := crDefault;
    Caption := 'finally';
  end;
end; 
Obwohl das "exit" vor dem "finally" steht, wird der "finally"-Block ausgeführt! Das ist das Schöne an diese Konstruktion, nämlich dass "finally" immer ausgeführt wird, egal wie die Routine verlassen wird. Und daher ist sie perfekt dafür geeignet, "Ressourcen" zu schützen, also um angeforderten Speicher wieder freizugeben, ein vorher erzeugtes Objekt wieder freizugeben, den Programm-Zustand (Cursor) wiederherzustellen usw.

Die nächste Frage wäre nun: was passiert, wenn im "finally"-Block selbst wieder eine Exception auftritt, z.B. bei dem von dir genannten CloseFile? Dann wird der "finally"-Block an dieser Stelle verlassen und das Programm springt zu einem evtl. (sogar in einer anderen Prozedur) vorhandenen "except"-Block. Hier eine Variante des 2.Beispiels:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c: Double;
begin
  Screen.Cursor := crHourglass;
  try
    try
      a := 1.0;
      b := 0.0;
      c := a/b;
    finally
      Caption := 'finally';
      c := a / b;
      Screen.Cursor := crDefault;
    end;
  except
    Caption := 'except';
  end;
end; 
Nun wird beim Auslösen der zweiten Exception im "finally"-Block dieser verlassen, bevor der Cursor zurückgesetzt wird; das Programm springt in den äußeren try-except-end Blck und schreibt "except" in die Titelzeile.

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Datei Speichern absichern

Beitrag von NoCee »

Jetzt wird mir einiges klarer was ich so im Netz so dazu gefunden habe.
Vor allem war mir der Unterschied zwischen den Versionen mit except bzw. finally
nicht klar. Da hat jemand im Netz geschrieben, daß das fast das selbe sei.
Und dem Satz bin ich ein Stück weit auf den Leim gegangen.
Für mich ist der elementare Unterschied das nach finally die exception noch mal ausgelöst wird,
also mein Programm trotzdem beendet wird und bei except eben nicht.
In meinem Fall will ich ja das die Software das Problem erkennt, drauf reagiert aber dann
auch weiterläuft.

Nach dem ichs jetzt kapiert hab, krieg ichs glaube ich hin.
Nur noch eine Kleinigkeit. Brauch ich aktuell zwar nicht, aber man ist halt neugierig:
Ich hab da gefunden, daß man die exception mit on... auswerten kann.
Wie ist mir klar, aber wo finde ich eine Liste welche exceptions es überhaupt gibt?

Vielen Dank für die Erläuterungen und die Beispiele.
Gruß
NoCee

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Datei Speichern absichern

Beitrag von MmVisual »

Die "Einfach-Variante", Beispiel:

Code: Alles auswählen

    Try
      ....
    Except
      On E:Exception Do // E ist dann die allgemeine Exception
      Begin
        DoLog(E.Message); // E.Message ist dann der Fehlertext
      End;
    End; 
Der Fehlertext kann man entweder loggen oder ein Dialog zeigen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Singlepin
Beiträge: 8
Registriert: Fr 28. Aug 2015, 17:00
OS, Lazarus, FPC: Windows 11 (L 2.0.12 FPC 3.2.0)
CPU-Target: 64Bit

Re: Datei Speichern absichern

Beitrag von Singlepin »


wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Datei Speichern absichern

Beitrag von wp_xyz »

Singlepin hat geschrieben:
Di 26. Mär 2024, 17:35
https://www.freepascal.org/docs/ClassChart1.pdf
Link editiert, so dass er funktioniert.

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Datei Speichern absichern

Beitrag von NoCee »

So, hab heute morgen wieder das Problem auf dem Server gehabt
und meine Software läuft noch. Fehler gemeldet, Daten gesichert und weitergelaufen.
Habs scheinbar kapiert.
Das mit der Message muß ich noch einbauen aber das exception handling
funktioniert auf alle Fälle.

Vielen Dank für die Infos und den Link
Gruß
NoCee

Antworten