Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z przekazywaniem własnego obiektu wyjątku

Ostatnio zmodyfikowano 2014-02-02 16:21
Autor Wiadomość
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:
C/C++
#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 // SOCKETEXCEPTION_H
Niestety przy próbie rzucenia wyjątku:
C/C++
ssize_t Socket::StartListen()
{
    if( GetDescriptor() < 0 )
    {
        //err_sys("Descriptor");
        SocketException ex( 0x01, "Problem z utworzeniem deskryptora gniazda.", errno );
        throw ex;
    }
    if( Bind() < 0 )
    {
        //err_sys("Bind");
        SocketException ex( 0x02, "Problem przy bindowaniu portu. Prawdopodobnie gniazdo jest zajęte.", errno );
        throw ex;
    }
    if( Listen() < 0 )
    {
        //err_sys("Listen");
        SocketException ex( 0x03, "Problem z wprowadzeniem gniazda w stan nasłuchiwania.", errno );
        throw ex;
    }
   
    Signal( SIGCHLD, & sig_child );
   
    return ld;
}
i jego obsługi:
C/C++
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ą? :(
P-103849
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
P-103868
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
P-103873
pekfos
» 2014-02-02 16:18:05
Poza tym po usunięciu destruktorów program się nawet nie kompiluje
Z błędem..?
P-103875
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ć.
P-103876
« 1 »
  Strona 1 z 1