[erledigt] Datei Speichern absichern
-
- 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
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
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.
- 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
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.
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).
-
- 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
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/
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
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;
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
Re: Datei Speichern absichern
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;
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;
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;
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;
-
- 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
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
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
-
- 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
Die "Einfach-Variante", Beispiel:
Der Fehlertext kann man entweder loggen oder ein Dialog zeigen.
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;
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: Datei Speichern absichern
Link editiert, so dass er funktioniert.
-
- 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
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
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