try except

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Benutzeravatar
Swirl
Beiträge: 96
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

try except

Beitrag von Swirl »

Hallo,

mal wieder ein recht simples Problem - Ich krieg's aber nicht gelöst...
Ich habe unter Winwos 11 Xampp laufen und das stellt mir den MySQL-Server
(eigtl. MariaDB) zu Verfügung. Manchmal dauert es etwas, bis der Server
aktiv wird (im Dialog bekommt das Modul die Farbe Grün).
Soweit-so-gut.
Ich habe ein (Datenbank-)Programm geschrieben, welches eine MySQL80Connection
'connected' schaltet, nur passiert das häufig eher, als Xampp den MySQL-
Server durchreicht. Dann wirft mein Programm natürlich einen Fehler.

Jetzt habe ich versucht, das Ganze per try-exept zu lösen, stoße dabe aber
leider auf meine Unkenntnis dieses Konstrukts 1.)Was mache ich verkehrt?
2.) Welche weitere Info wird gebraucht?

Code: Alles auswählen

procedure TfrmZugang.FormCreate(Sender: TObject); 
begin
  try
    MySQL80Connection1.Connected := True;
  except
    On E:EDatabaseError do
    begin
       Label11.Caption := 'MySQL is not running';
    end;
  end;
end;
Besten Dank im Voraus,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: try except

Beitrag von gladio »

Eventuell ist eine Warteschleife angebracht

Code: Alles auswählen

...
repeat
 wait(1); //oder delay()
until MySQL80Connection1.Connected = True;
 ..
 Label11.Caption := 'MySQL is running';

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: try except

Beitrag von Winni »

Hi!

Nie so etwas in FormCreate veranstalten. FormActivate ist sicherer.

Die Idee mit der Schleife ist richtig, nur dass es in fpc kein wait gibt.

Halbe Sekunde warten geht so:

Code: Alles auswählen

sleep (500);
Winni

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: try except

Beitrag von six1 »

Ich nehme immer die GetTickCount in eine Variable, um einen definierten Zeitabstand zu warten und in der Schleife nur application.processmessages.
Gruß, Michael

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: try except

Beitrag von charlytango »

Swirl hat geschrieben:
Fr 4. Nov 2022, 13:33
mal wieder ein recht simples Problem - Ich krieg's aber nicht gelöst...
Ich habe unter Winwos 11 Xampp laufen und das stellt mir den MySQL-Server
(eigtl. MariaDB) zu Verfügung. Manchmal dauert es etwas, bis der Server
aktiv wird (im Dialog bekommt das Modul die Farbe Grün).
Soweit-so-gut.
Ich habe ein (Datenbank-)Programm geschrieben, welches eine MySQL80Connection
'connected' schaltet, nur passiert das häufig eher, als Xampp den MySQL-
Server durchreicht. Dann wirft mein Programm natürlich einen Fehler.
ich benutze die Kombi xampp und Lazarus zum Entwickeln seit Dekaden und so ein Verhalten kenne ich nicht (Win 10). Allerdings sehe ich das Konzept eines SQL-Servers und der Applikation wohl anders. Denn der MariaDB/MySQL wird als eigenständig betrachtet und hat per se nichts mit der Applikation zu tun. Deswegen starte ich MariaDB/MySQL IMMER vor der Applikation denn der Server könnte genausogut auf einem anderen Rechner laufen oder irgendwo anders wohin die Applikation keinen Einfluss hat.
Deswegen reicht bei mir ein Try/except das mangels DB-Zugriff die Applikation beendet.

Code: Alles auswählen

 
  try
     ZConnection1.Connect;  //wobei das mit SQLdb gleich ist
  except
     on E: Exception do
     begin
       MessageDlg(' -> Fehler bei Verbindung zur Datenbank. DB nicht erreichbar? ' + LineEnding +
                   '(Programm wird abgebrochen): ' + LineEnding + LineEnding +
                   'Unit: ' + UnitName + LineEnding +
                   'File: ' + {$INCLUDE %FILE%} + LineEnding +
                   'Methodname: ' +  {$I %CURRENTROUTINE%} + LineEnding +
                   'Linenumber: ' + {$INCLUDE %LINE%} + LineEnding +
                   E.Message + LineEnding +
                   'Class: ' + LineEnding +
                   E.ClassName, mtError, [mbOK], 0);

       Application.Terminate;
     end;

  end;
Das Connect auf die (bereits gestartete) lokale DB geht bei mir praktisch sofort, auch auf eine remote DB ist keine nennenswerte Verzögerung zu bemerken.
Wenn Kunden XAMPP oder lokale Mysql etc verwenden sorge ich dafür dass die DB automatisch beim Systemstart mit gestartet wird. Keine Trickserei mit Warteschleifen nötig.

Ich denke ich werde W11 verweigern ggg

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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: try except

Beitrag von af0815 »

Ich habe auch Probleme festzustelle ob ein entfernter MS-SQL Server erreichbar ist bzw. ob die Verbindung abgebrochen ist. Ich verwende dazu einen Ping unmittelbar bevor ich die Connection aufbaue. Ich habe festgestellt, wenn der Server per Ping erreichbar ist, so ist auch eine Connection möglich. Nachdem die Connection selbst nicht wirklich feststellen kann ob die Verbindung noch steht, mache ich vor einer Abfrage mittels Query einen Ping. Falls die Queries schnell hintereinander kommen, so unterdrücke ich den Ping. Das ist einigermassen sicher und ich vermeide damit ungewollte (tiefe - aus dem Treiber hochkommende) Exceptions relativ zuverlässig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Swirl
Beiträge: 96
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: try except

Beitrag von Swirl »

thx erstmal für die vielen Antworten:

Bevor ich 0815's Methode checke, möchte ich charlytango's Version ausprobieren.
Ich habe den Code auf ein Minimum runtergebrochen und auch nach FormActivate
verschoben.

Code: Alles auswählen

procedure TfrmZugang.FormActivate(Sender: TObject);
begin
  try
    MySQL80Connection1.Connected := True;
    except
       on E: Exception do
       begin
         lblMitteilung1.Caption := 'Xampp stösst MariaDB-Server zu spät an :-(';
        //Application.Terminate;
       end;
    end;
end;
leider bekomme ich keine Mitteiung nach "lblMitteilung 1", sonder immer nur eine "Systemmitteilung"...

Bild

Besten Dank im Voraus,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: try except

Beitrag von Winni »

Hi!

Das ist keine Systemmeldung, sondern der Debugger.
Wenn Du Dein Programm außerhalb der IDE startest, erscheint die nicht,

Und häng Deinen Code doch mal in eine Schleife.:

Code: Alles auswählen

procedure TfrmZugang.FormActivate(Sender: TObject);
begin
repeat
  try
    MySQL80Connection1.Connected := True;
    except
       on E: Exception do
       begin
         lblMitteilung1.Caption := 'Xampp stösst MariaDB-Server zu spät an :-(';
        Application.ProcessMessages;
       end;
    end;
until    MySQL80Connection1.Connected ;
lblMitteilung1.Caption := 'OK';
onActivate := Nil; 
end;
onActivate muss auf Nil gesetzt werden, da das unter Windows sonst mehrfach ausgeführt werden kann. Unter Linux wird es nur einmal ausgeführt.

Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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: try except

Beitrag von af0815 »

Die Debuggermeldung kann man in Lazarus deaktivieren, das hilft beim Testen und man hat trotzdem den Debugger.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Swirl
Beiträge: 96
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: try except

Beitrag von Swirl »

Hallo,
das ist eben mein Problem :(
ich habe in den Werkzeugen => Einstellungen den Debugger ausgeschaltet und ebenso în den Projekteinstallungen. Die Debuggermeldungen kommen immer noch. ebenso wenn ich das Programm als solches starte, kommt die Systemmeldung.
Zusätzlich kann ich eine Form nicht mehr öffnen - weder normal noch modal. Die uses und das LPR-File scheinen mir auch korrekt zu sein - scheiß Samstag.
Trotzdem besten Dank Euch Beiden,
Michael

Update: Das Problem mit dem Öffnen/modalen Öffnen des Formulars hat sich erledigt...
Zuletzt geändert von Swirl am So 6. Nov 2022, 08:04, insgesamt 1-mal geändert.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: try except

Beitrag von charlytango »

ich hab mit dem Verständnis immer noch ein Problem.

Wenn ich mit dem XAMPP Control Panel den MySQL Server starte sehe ich ob der nach dem Startversuch läuft oder nicht. Demnach sollte ein Connect doch kein Problem sein.

Aus dem Code kann ich übrigens nicht herauslesen ob und wann du "XAMPP" startest.
Wie startest du XAMPP ? Alle Komponenten auf einmal? oder nur den MySQL Server? Möglicherweise liegt dort der Hase im Pfeffer. Auf welchem Rechner läuft das? Ausreichend RAM und Leistung für alle Services?

Bin immer noch der Meinung dass das zwei verschiedene Paar Schuhe sind und sein sollten.
Die Applikation läuft unabhängig vom SQL-Server, das ist das Wesen von Client/Server.
Wenn du das Konzept änderst trittst du dir naturgemäß andere Probleme ein.

Benutzeravatar
Swirl
Beiträge: 96
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: try except

Beitrag von Swirl »

Hallo charlytango,
ch hab mit dem Verständnis immer noch ein Problem.

Wenn ich mit dem XAMPP Control Panel den MySQL Server starte sehe ich ob der nach dem Startversuch läuft oder nicht. Demnach sollte ein Connect doch kein Problem sein.
Ich starte Xampp nicht mittels Control Panel, sondern habe festgelegt, dass MySQL/MariaDB automatisch mit Windows starten. Und das läuft halt nicht immer spontan mit dem Windows-Start synchron ab. Das Ganze läuft beim Kunden - und dem möchte ich nicht jedesmal zumuten, zu schauen, ob MySQL bereits "auf grün" steht, oder noch nicht.

Mein Programm startet eh per Autostart und kommt deshalb dem (zeilich unzuverlässigen [sorry]) Autostart des MySQl-Servers in die Quere.

Mein Problem besteht also weiterhin in der Lösung per try-except ohne(!) Systemdialog (s.o.), sondern per Meldung im Programm(!)

Besten Dank der Nachfrage trotzdem!
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: try except

Beitrag von theo »

Oder so, falls der Dienst auf dem gleichen Rechner läuft?
https://wiki.lazarus.freepascal.org/Ser ... de_example

Benutzeravatar
Swirl
Beiträge: 96
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: try except

Beitrag von Swirl »

Danke für den Tip, Theo - hatte ich auch schon durch. ;-)

Leider kann der Dienst (nebst DB) auf einem x-beliebigen Rechner laufen.
Mir geht es prinzipiell außerdem um das Konstrukt try-except und das soll
per "lege artis" auch auch meiner Dose laufen.
Mir will es nicht in den Kopf, dass es bei den vielen Vorschlägen im Forum
und im Web bei mir nicht laufen soll.
Ich habe ein Label und auf dem soll eine Mitteilung über den Zustand
des MySQL-/MariaDB-Servers mitgeteilt werden. So-und-nicht-anders.

Sorry Theo - und nix für ungut
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: try except

Beitrag von h-elsner »

Was ist denn eigentlich die Frage oder was geht nicht bei deinem Beispiel ganz oben?

Vielleicht wird gar kein EDatabaseError ausgelöst. Was passiert denn, wenn du einfach folgendes machst:

Code: Alles auswählen

procedure TfrmZugang.FormCreate(Sender: TObject); 
begin
  try
    MySQL80Connection1.Connected := True;
  except
     Label11.Caption := 'MySQL is not running';
  end;
end;
Man könnte dann auch noch ausgeben, was für eine Exception geworfen wird.

Gruß HE

Antworten