Problem z przekazywaniem własnego obiektu wyjątku
Ostatnio zmodyfikowano 2014-02-02 16:21
Bartoneczek Temat założony przez niniejszego użytkownika |
Problem z przekazywaniem własnego obiektu wyjątku » 2014-02-02 13:17:50 Witam serdecznie, Mam pewien problem z obsługą wyjątków. Może najpierw wspomnę że stworzyłem sobie własną klasę wyjątków: #ifndef SOCKETEXCEPTION_H #define SOCKETEXCEPTION_H
#include "Exception.h"
class SocketException : public Exception { public: SocketException( unsigned int _id, string _message, unsigned int _errId ) : Exception( _id, _message ) , errId( _errId ) { }; unsigned int errId; ~SocketException(); };
#endif
Niestety przy próbie rzucenia wyjątku: ssize_t Socket::StartListen() { if( GetDescriptor() < 0 ) { SocketException ex( 0x01, "Problem z utworzeniem deskryptora gniazda.", errno ); throw ex; } if( Bind() < 0 ) { SocketException ex( 0x02, "Problem przy bindowaniu portu. Prawdopodobnie gniazdo jest zajęte.", errno ); throw ex; } if( Listen() < 0 ) { SocketException ex( 0x03, "Problem z wprowadzeniem gniazda w stan nasłuchiwania.", errno ); throw ex; } Signal( SIGCHLD, & sig_child ); return ld; } i jego obsługi: try { ld = socket->StartListen(); while( 1 ) { fd = socket->Accept(); if( fd < 0 ) { if( errno == EINTR ) continue; } else { cout << "Połączono." << std::endl; } } } catch( SocketException ex ) { cout << ex.message << " Kod błędu: " << ex.errId << endl; } Otrzymuję błąd: terminate called after throwing an instance of 'SocketException'.
Co może być tego przyczyną? :( |
|
japer |
» 2014-02-02 14:45:40 Po pierwsze, masz błędy składniowe w wyjątku, może one powodują błąd. (ten średnik przy ciele konstruktora nie jest potrzebny, publiczne pole jest obleśne, ale to tylko mój gust) Po drugie wyrzucaj wyjątek jako obiekt tymczasowy a łap jako referencję. W takim wypadku obiekt nie musi być kopiowany.
EDIT: A po trzecie, jeśli nie potrzebujesz destruktora, to jego nie deklaruj :> PS: Jestem zbanowany na Wykopie, tak bym na mirku odpisał :s |
|
Bartoneczek Temat założony przez niniejszego użytkownika |
» 2014-02-02 16:07:32 @japer: średniki usunięte, ale one za bardzo nic nie bruździły. :D Zmieniłem na obiekty tymczasowe i przekazuję je przez referencję. Problem jak był, tak jest. Co do pól publicznych, ja wiem, wiem. :> Poza tym po usunięciu destruktorów program się nawet nie kompiluje (zachowuje się tak jakby throw wywoływał destruktor obiektu).
I dalej ten sam problem. :(
BTW. Za co Cię zbanowali? XD |
|
pekfos |
» 2014-02-02 16:18:05 Poza tym po usunięciu destruktorów program się nawet nie kompiluje |
Z błędem..? |
|
Bartoneczek Temat założony przez niniejszego użytkownika |
» 2014-02-02 16:21:24 Z błędem odwołania do destruktorów które nie istnieją. :D Problem chyba rozwiązany, wyrzuciłem tworzenie wątku z try {} i zaczęło działać. |
|
« 1 » |