![]() |
Funktion nach except Block nicht verlassen
Hallo erstmal,
Wie schaffe ich es nach dem auslösen einer Exception nicht aus der Funktion zu fliegen.
Delphi-Quellcode:
Also das beep noch auszuführen.
Function Konvertiere : integer;
begin try Result:=strtoint('Hallo'); except Result:=0; end; beep; end; Hintergrund der Sache ist natürlich nicht so ein einfaches Beispiel. Ich muß mich in einer Schleife mit mehreren DBServern verbinden. Sind die jedoch gerade heruntergefahren oder haben eine Störung bleibt mein System an der Stelle mit einer Exception stehen. Schonmal Danke im vorraus. Gruß Daniel |
Re: Funktion nach except Block nicht verlassen
Eigentlich sollte er nach dem end ganz normal weiterlaufen, also nicht rausfliegen. Lass doch mal die echte Funktion sehen!
|
Re: Funktion nach except Block nicht verlassen
Hallo Nochmal
Delphi-Quellcode:
Gruß und danke
procedure Meinform.ConnectServer();
var i : integer; begin for i:=0 to WriteServer.Count-1 do begin try TIbDatabase(WriteServer[i]).Connected:=True; // WriteServer ist ein TListObjekt except end; end; ReadServer.Connected:=true; // <--- hier kommt er nie an wenn einer der Server down ist ... // Fehler: I/O Error for File "MeineDatenbank" // Error while trying to open file // Das System kann die angegebene Datei nicht finden. end; Daniel |
Re: Funktion nach except Block nicht verlassen
Kann es sein, dass das Verbinden zu den Servern nicht unmittelbar, sondern vielleicht sogar in einem eigenen Thread abläuft?
|
Re: Funktion nach except Block nicht verlassen
Wie wäre es wnen du zwei Funktionen/Proeduren draus machst.
Delphi-Quellcode:
Spricht was dagegen?procedure blabla(); var i : integer; begin for i:=0 to WriteServer.Count-1 do begin try TIbDatabase(WriteServer[i]).Connected:=True; // WriteServer ist ein TListObjekt except end; end; end; procedure Meinform.ConnectServer(); begin BlaBla(); ReadServer.Connected:=true; // <--- hier kommt er nie an wenn einer der Server down ist ... // Fehler: I/O Error for File "MeineDatenbank" // Error while trying to open file // Das System kann die angegebene Datei nicht finden. end; Gruß |
Re: Funktion nach except Block nicht verlassen
Hi,
mal in eine andere Richtung gefragt: Kehrt Dein Aufruf
Delphi-Quellcode:
wieder zurück und Deine Function wird ohne Abarbeitung der Code-Zeilen hinter Deinem Except end Block verlassen?
TIbDatabase(WriteServer[i]).Connected:=True;
Oder blockiert der benannte Aufruf bei failed deinen Programmablauf? Bei letzterem hättest du dann kein Problem mit deinem Except-Block, sondern wie du bei fehlerhafter Connection weiterkommst. Gruß oki |
Re: Funktion nach except Block nicht verlassen
Hallo,
erstmal danke für die vielen Antworten. Wenn das Connected fehlschlägt kehrt er zum Formular zurück. Oben genannte Funktion wird verschachtelt über eine Ereignissbehandlungsroutine aufgerufen welche wiederum Funktionen aufruft. Eine dieser Funktionen ist diese ConnectServer Routine. Für das Programm ist nach der Exception das Ereigniss beendet (Also er springt nicht mal zu irgendeinem end irgendeiner dieser Funktion übergeordnetten Funktionen) Also ich meine das etwa so.
Delphi-Quellcode:
Das es, wie Mario schon sagte, in einem anderen Thread läuft kann sein. Aber wie macht man es dann ?
...
Procedure Meinereigniss(Sender : TObject); begin ... Startunterfunktion() ... end; // <-- hier kommt er im Fehlerfall nicht hin Procedure Startunterfunktion(); begin ... ConnectServer() ... // <-- hier kommt er im Fehlerfall auch nicht hin end; procedure Meinform.ConnectServer(); var i : integer; begin for i:=0 to WriteServer.Count-1 do begin try TIbDatabase(WriteServer[i]).Connected:=True; // WriteServer ist ein TListObjekt except end; end; ReadServer.Connected:=true; // <-- hier kommt er im Fehlerfall nicht hin ... end; Gruß Daniel |
Re: Funktion nach except Block nicht verlassen
Dann kannst Du es nicht da abfangen. Dann ist es aber gut möglich, dass der Server ein Ereigniss für Fehler hat. Alternativ kannst Du ja mal das Application.OnException probieren.
|
Re: Funktion nach except Block nicht verlassen
Ich hab jetzt ne Möglichkeit gefunden aber wirklich gefallen tut sie mir nicht.
Delphi-Quellcode:
Damit wird das nach der Schleife genau einmal aufgerufen egal wie oft der Fehler auftritt.procedure Meinform.ConnectServer(Posi : integer = 0); var i : integer; begin for i:=Posi to WriteServer.Count-1 do begin try TIbDatabase(WriteServer[i]).Connected:=True; // WriteServer ist ein TListObjekt except ConnectServer(i+1); end; end; ReadServer.Connected:=true; // <-- hier kommt er im Fehlerfall nicht hin ... end; |
Re: Funktion nach except Block nicht verlassen
Hallo,
ich denke mal, was woanders passiert ist hier wurst. Die Fragestellung impliziert doch hier die Annahme, das bei fehlerhaftem Connect eine Exception ausgelöst wird und das Problem darin besteht, dass der Code nach dem Except-Block ausgelassen wird. Wenn das so ist, muß ich hier passen. Ich hatte zwar mal ähnliche Probleme, aber dort war es so, dass bei eigenen Threads oder fremden auf Grund des Fehlers andere richtige Probleme auftauchten (Stack im Schrott etc.). Dort mußte der Fehler an einer asnderen Stelle beseitigt werden. Die Ursache hatte dann aber nichts mit Fehlern an den Stellen zu tun, an denen alles den Bach runter ging. Das hat dann an dieser Stelle nur häftig reingeschmiert. Gruß oki PS: Vielleicht hab ich ja auch immer noch nicht die Frage verstanden :stupid: |
Re: Funktion nach except Block nicht verlassen
Bei SOAP hatte ich mit ähnlichen Problemen zu kämpfen. Nach dem wir als Clients für unsere Anwendung nur WinNT oder höher zugelassen haben, haben wir das Problem mit 3 fachen try-except-Blöcken in den Griff bekommen:
Ein einfachen try-Except-Block um den fehleranfälligen Aufruf. Ein einfachen try-Except-Block um den Aufruf der gesamten Procedure. Exceptionbehandlung bei Application.OnException (oder so ähnlich). Naja, wir haben dann auch Logs geschrieben und die Levels 1-3 vergeben. Die Fehler wurden immer wieder auf den verschiedensten Stufen abgefangen. |
Re: Funktion nach except Block nicht verlassen
Hallo nochmal,
Ich habs jetzt mal wie Mario beschrieben in mehrere Try...Except Blocks gesetzt jetzt funzt es.
Delphi-Quellcode:
Er landet dann komischerweise, wie es sein muß, immer nach dem ersten except. procedure Meinform.ConnectServer(); var i : integer; begin for i:=0 to WriteServer.Count-1 do begin try try try TIbDatabase(WriteServer[i]).Connected:=True; // WriteServer ist ein TListObjekt except end; except end; except end; end; ReadServer.Connected:=true; ... end; Naja, nicht schön aber der Code nach der Exception wird wenigstens ausgeführt. Nochmal danke für die Antworten Gruß Daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 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 by Thomas Breitkreuz