try .. catch nötig bei Socketverbindung ?



  • Hallo,

    zum Öffnen / Schließen einer Socketverbindung mache ich so etwas:

    try
    {
      dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Host=...
      //Verbindung zum ServerSocket herstellen:
      dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Open();
    }
    catch (Exception &E)
    {
      //Verbindung beenden u. damit Port freigeben:
      dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Close();
      dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Socket->Close();
    }
    

    try-catch bräuchte ich doch hier gar nicht, weil doch dynamic_cast auf Zeiger gar keine Exceptions erzeugen, oder?

    Wäre dies hier richtig(er):

    dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Host=...
    if (dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Open() ==0)
    {
      //Verbindung beenden u. damit Port freigeben:
      dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Close();
      dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Socket->Close();
    }
    

    Oder doch ganz anders???
    Danke!!!!



  • Ja, letzteres ist richtig, zumindestens fast.
    Du solltest den dynamic_cast jedoch nur einmalig durchführen:

    TClientSocket* socket = dynamic_cast<TClientSocket*>(Components[ClientSocket_Index]);
    if(socket)
    {
      socket->Host = "127.0.0.1";
      if (socket->Open() == 0)
      {
        //Verbindung beenden u. damit Port freigeben:
        socket->Close();
      }
    }
    

    Wie du schon geschrieben hast, wird bei Zeigern keine Exception geworfen, sondern ein Nullzeiger zurückgegeben, daher die if-Abfrage.

    P.S. Sofern du deinen Code innerhalb von Form-Methoden geschrieben hast, solltest du niemals "Form1->" o.ä. benutzen (außer du willst explizit auf eine fremde Form-Instanz zugreifen).

    Und 2.: Dein Zugriff mittels "Components[ClientSocket_Index]" kommt mir auch sehr komisch vor! Wenn du statisch eine TClientSocket-Komponente auf deine Form gezogen hast, dann kannst du doch direkt mit dem Namen darauf zugreifen - und bei dynamischer Erzeugung merkst du dir den Namen in einer Klassenmembervariablen und hast ebenfalls Zugriff darauf...

    Edit: ich sollte erst die Rechtschreibung überprüfen (oder nicht versuchen, schneller zu tippen als ich es eigentlich kann -)



  • Danke!
    Compiler bringt aber bei "if (socket->Open() == 0)" den Fehler "kein zulässiger Typ"!?



  • Ich hatte nur deinen Code umformatiert, d.h. nicht selber überprüft, ob alle Methoden so korrekt sind. Open() hat keinen Rückgabewert, also

    socket->Open();
    if(socket->Active)
    {
      // ...
    }
    

Anmelden zum Antworten