I`m writing client-server app for windows using WinSock and I have class for server.
while initialising server I have such code:
class Server { static const int MaxClients = 10; std::vector connections; CRITICAL_SECTION cs; int port; SOCKET ServerSocket; sockaddr_in ServerAddress; void init(); public: Server(int Port); void addConnection(const Client& newClient); void closeConnection(int index); void Listen(); int size(); /*virtual void ClientService(); virtual void SendMsg(const std::string& msg);*/ virtual ~Server(); }; void Server::init() { WSADATA wsaData; if(WSAStartup(MAKEWORD(2, 2), &wsaData)) throw Exception('WinSock init failed'); ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (ServerSocket == INVALID_SOCKET) throw Exception('Socket failed to create!'); ServerAddress.sin_family = AF_INET; ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); ServerAddress.sin_port = htons(port); if(bind(ServerSocket,(sockaddr*)&ServerAddress,sizeof(ServerAddress)) == SOCKET_ERROR) { throw Exception('Binding failed'); closesocket(ServerSocket); } }
where do I need to handle exceptions? Here, in init() private method (which is called from constructor) or in main function? Any rules existing where to place handlers for exceptions and what does it depend on?
It depends on whether you’re actually going to handle the exception, e.g. retry with a slightly different input, or decide to ignore the problem and proceed anyway (rarely appropriate, but can be useful). In this case, you may well want to catch the exception close to its source.
In most cases, the only thing you can really do with an exception is log it and abort the operation (e.g. serve the user an error page in a web app, or pop up a friendly ‘this program has crashed, sorry’ dialog and exit). In this case, your catch block is likely to be quite close to the top of the stack – e.g. in the main method.