Probleme mit Exceptionhandling



  • Ich nutze Indy 9.
    Ich habe einen TCPServer und einen TCPClient.
    Vom Server aus disconnecte ich den Client.
    Beim Client kommt dann die Exception "Connection Closed Gracefully".
    Hat einer eine Idee wie ich das Abfangen kann?
    Mit try und catch kann ich nichts anfangen, da die Exception vom Client kommt.



  • Zu beachten ist, dass im Builder grundsätzlich alle Fehler angezeigt werden. Mit try/catch kann man diese nicht unterdrücken. Starte die Anwendung mal direkt, also nicht aus dem Builder heraus. Dann sollte es funktionieren.



  • Tut mir leid, ich habe vergessen zu sagen, dass ich es außerhalb der IDE gestartet habe.

    Das Problem kommt also immer.



  • // Edit

    Poste mal relevanten Code. Normalerweise sollte es funktionieren.



  • Ich les mir grad den relevanten Code durch und merke, dass da wirklich was nicht stimmt.

    Ich habe da heute Mittag was rausgestrichen, was ich später wieder einfädeln wollte und ich habs vergessen.

    Muss den Code nochmal überarbeiten, der ist doch recht kompliziert.



  • OK, Ich hab jetzt alles eingefädelt.

    Die Exception kommt allerdings immernoch.

    Hier ist der Code:

    Der Code soll so etwas wie ein Serverneustart sein.

    void __fastcall TClientList::Reset(void)
    {
      TClientChannel* ActChannel = ChStart;
    
      while(ActChannel->GetNachfolger())
      {
        ActChannel = ActChannel->GetNachfolger();
        ActChannel->GetVorgaenger()->Reset();
        delete ActChannel->GetVorgaenger();
      }
    
      ActChannel->Reset();
      delete ActChannel;
    
      ChStart = 0;
      ChEnde = 0;
    
      Server->TCPServer->Active = false;
      Server->TCPServer->Active = true;
    }
    

    Der Code aus dem Channel:

    void __fastcall TClientChannel::Reset(void)
    {
      TClient* ActClient = Start;
      while(ActClient)
      {
        ActClient->Reset();
        ActClient = ActClient->GetNachfolger();
      }
    }
    

    Und dann der von den Einzelnen Clients:

    void __fastcall TClient::Reset(void)
    {
      Client->Data = 0;  //TIdPeerThread* Client;
      Client->Connection->DisconnectSocket();
      Client = 0;
    }
    

    In den TClientChannel-Destruktoren werden entsprechend die TClient Objekte gelöscht, wo die Threadadressen gespeichert waren.



  • Ja und wo ist Deine try/catch - Kapselung? Alternativ kannst Du es auch mit dem Event OnException der ApplicationEvents-Komponente probieren.



  • Genau aus diesem Grund hab ich diesen Thread ja eröffnet.

    Das ist der Code auf der Seite des Servers.
    Die Exception kommt allerdings vom Client.

    Wo soll ich jetzt beim Client eine Try/Catch hinsetzen um das abzufangen?

    Die Sache mit dem OnException werd ich mir gleich mal angucken.



  • Alles klar!

    Ich habe das jetzt so gelöst, wie es in der Hilfe geschrieben steht.

    void __fastcall TClient::AppException(TObject *Sender,Exception *E)
    {
      if(!E->Message.Pos("Connection Closed Gracefully"))
      {
        Application->ShowException(E);
        Application->Terminate();
      }
    }
    
    Application->OnException = AppException;
    

    Jetzt funktioniert es.

    Danke für die Hilfe.


Anmelden zum Antworten