Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion nach except Block nicht verlassen (https://www.delphipraxis.net/12432-funktion-nach-except-block-nicht-verlassen.html)

danielA 27. Nov 2003 12:13


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:
Function Konvertiere : integer;
begin
  try
    Result:=strtoint('Hallo');
  except
    Result:=0;
  end;
  beep;
end;
Also das beep noch auszuführen.

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

Treffnix 27. Nov 2003 12:19

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!

danielA 27. Nov 2003 13:18

Re: Funktion nach except Block nicht verlassen
 
Hallo Nochmal

Delphi-Quellcode:
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;
Gruß und danke

Daniel

Mario 27. Nov 2003 13:21

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?

Tyrael Y. 27. Nov 2003 13:31

Re: Funktion nach except Block nicht verlassen
 
Wie wäre es wnen du zwei Funktionen/Proeduren draus machst.

Delphi-Quellcode:

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;
Spricht was dagegen?


Gruß

oki 27. Nov 2003 13:39

Re: Funktion nach except Block nicht verlassen
 
Hi,

mal in eine andere Richtung gefragt:
Kehrt Dein Aufruf
Delphi-Quellcode:
TIbDatabase(WriteServer[i]).Connected:=True;
wieder zurück und Deine Function wird ohne Abarbeitung der Code-Zeilen hinter Deinem Except end Block verlassen?

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

danielA 27. Nov 2003 14:40

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:
...

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;
Das es, wie Mario schon sagte, in einem anderen Thread läuft kann sein. Aber wie macht man es dann ?

Gruß Daniel

Mario 27. Nov 2003 14:42

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.

danielA 27. Nov 2003 14:45

Re: Funktion nach except Block nicht verlassen
 
Ich hab jetzt ne Möglichkeit gefunden aber wirklich gefallen tut sie mir nicht.

Delphi-Quellcode:

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;
Damit wird das nach der Schleife genau einmal aufgerufen egal wie oft der Fehler auftritt.

oki 27. Nov 2003 14:53

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.
Seite 1 von 2  1 2      

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