exeption werfen



  • hab ne klasse socket:

    class Socket
    {
     public:
      Socket();
      ~Socket();
    
      // Server initialization
      bool create();
      bool bind ( const int port );
      bool listen() const;
      bool accept ( Socket& ) const;
    
      // Client initialization
      bool connect ( const std::string host, const int port );
    
      // Data Transimission
      bool send ( const std::string ) const;
      int recv ( std::string& ) const;
    
      void set_non_blocking ( const bool );
    
      bool is_valid() const { return m_sock != -1; }
    
     private:
    
      int m_sock;
      sockaddr_in m_addr;
    
    };
    
    bool Socket::create()
    {
      m_sock = socket ( AF_INET,
    		    SOCK_STREAM,
    		    0 );
    
      if ( ! is_valid() )
        return false;
    
      // TIME_WAIT - argh
      int on = 1;
      if ( setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* ) &on, sizeof ( on ) ) == -1 )
        return false;
    
      return true;
    
    }
    

    wie kann ich da ne exeption aus der methode create werfen? wenn beim da was schief geht?

    cu



  • if(!is_valid())
        throw exception("Hilfe!");
    

    Dann sollte der Rückgabetyp von create() aber void und nicht bool sein.

    Allerdings hat das mit der WinAPI recht wenig zu tun, das ist eher ein Standard C++ Problem.



  • Dieser Thread wurde von Moderator/in cd9000 aus dem Forum WinAPI in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • imo macht es hier eher wenig Sinn eine Ausnahme zu werfen, bool als Rückgabewert reicht vollkommen. Ein Exception sollte man werfen, wenn ein Objekt sich in einem Zustand befindet, bei dem praktisch jede weitere Aktion fehlschlagen wird. Bei dir ist es aber nicht der Fall, vorallem weil es sich um eine Kapselung handelt. Als Beispiel könnte man die at-Methode von std::vector nehmen:

    try {
        A& a = vec.at(0);
        //existiert, arbeite weiter
    }
    catch (std::out_of_range&) {
        //oops, vector ist leer
    }
    
    try {
        Image a(CreateImage()); //wirft eine Ausnahme
        a.Rotate(-90);
        a.Flip();
        a.Draw();
        //...
    }
    catch (std::runtime_error&) { }
    
    //der Klassiker
    try { A& a = dynamic_cast<A&>(b); }
    catch (std::bad_cast&) { }
    


  • wo kann man bei einer klasse socket ne exception werfen?
    mach no so einen filetransfer+chat - server, client usw...

    cu



  • int main ()
    {
      std::cout << "running....\n";
    
      try
      {
          // Create the listening socket
          ServerSocket server ( 30000 );
    
          while ( true )
          {    
              //create the conversational socket
              ServerSocket new_sock;
    
              // wait for a client connection
              server.accept ( new_sock );
    
              try
              {
                  while ( true )
                  {  
                      // read the string and write it back
                      std::string data;
                      new_sock >> data;
                      new_sock << data;
                  }
              }
              catch ( SocketException& ) {}
    
          }
      }
      catch ( SocketException& e )
      {
          std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
      }
    
      return 0;
    }
    }
    

    wär sowas nicht hilfreich? in punkto sockets...

    cu



  • Wenn die accept-Methode ein Socket-Objekt zurückgeben würde, könnte man eine Exception werfen. Bei read und write kannst du dich an Stream-Klassen der Standardbibliothek orientieren.

    Aber wie gesagt, es ist lediglich meine Meinung, vielleicht kann noch jemand anders etwas zu diesem Thema sagen. 🙂



  • Shlo schrieb:

    Wenn die accept-Methode ein Socket-Objekt zurückgeben würde, könnte man eine Exception werfen. Bei read und write kannst du dich an Stream-Klassen der Standardbibliothek orientieren.

    Aber wie gesagt, es ist lediglich meine Meinung, vielleicht kann noch jemand anders etwas zu diesem Thema sagen. 🙂

    void Socket::accept ( Socket& new_socket ) const
    {
      int addr_length = sizeof ( m_addr );
      new_socket.m_sock = ::accept ( m_sock, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length );
    
      if ( new_socket.m_sock <= 0 )
        throw exception("");
    
    }
    

    wie soll accept-Methode ein Socket-Objekt zurückgeben ??? hmm

    cu


Anmelden zum Antworten