Avatar billede oddi Nybegynder
16. august 2008 - 19:24 Der er 11 kommentarer og
1 løsning

throw (exception)

Hej Eksperter.

Jeg har et problem med throw (exception)

Jeg har en exception klasse:

class OvSocketException
{
public:
        OvSocketException();
    void OvSocketExceptionSet(const std::string& message) {msg = message;}
    const std::string& OvSocketGetError() const {return msg;}
   
private:
    std::string msg;
};

Jeg har en klasse hvor jeg skal bruge exception klassen:

class OvSocket
{
public:
somefunc
private:
OvSocketException OvEx
};

Fejlen sker i somefunc:

somefunc
{
  std::string msg; 

  if(...)
  {
    throw OvEx.OvSocketExceptionSet(msg)  <- fejlen er her....
  }
}

compileren siger:
‘((OvSocket*)this)->OvSocket::OvEx’ does not have class type

Hvad gør jeg forkert?
Avatar billede arne_v Ekspert
16. august 2008 - 21:38 #1
OvSocketExceptionSet returnerer void
Avatar billede arne_v Ekspert
16. august 2008 - 21:39 #2
prøv:

if(...)
  {
    OvEx.OvSocketExceptionSet(msg);
    throw OvEx;
  }
Avatar billede oddi Nybegynder
16. august 2008 - 22:01 #3
Jeg har nu prøvet at udkommentere throw og lave OvEx.OvSocketExceptionSet(msg), men jeg får fejlen:
error: ‘((OvSocket*)this)->OvSocket::OvEx’ does not have class type

Kan det være en fejl i min Makefile?
Avatar billede arne_v Ekspert
16. august 2008 - 23:12 #4
Følgende compiler fint her:

#include <string>

class OvSocketException
{
    public:
        OvSocketException();
        void OvSocketExceptionSet(const std::string& message) {msg = message;}
        const std::string& OvSocketGetError() const {return msg;}
    private:
        std::string msg;
};

class OvSocket
{
    public:
        void somefunc();
    private:
        OvSocketException OvEx;
};

void OvSocket::somefunc()
{
  std::string msg = "bla bla";
  OvEx.OvSocketExceptionSet(msg);
  throw OvEx;
}
Avatar billede segmose Nybegynder
18. august 2008 - 10:56 #5
Lav en constructor der tager din string som parameter, noget lignende (utestet):

class OvSocketException {
    public:
        OvSocketException();
        OvSocketException(const std::string& message) {msg = message;}
        void OvSocketExceptionSet(const std::string& message) {msg = message;}
        const std::string& OvSocketGetError() const {return msg;}
    private:
        std::string msg;
};

Så kan du lave noget som

throw OvEx("oh noes!");
Avatar billede kenneth_gorking Nybegynder
18. august 2008 - 12:50 #6
Mener du ikke 'throw OvSocketException("oh noes!");'?

Det ville nok være nemmere at bruge de predefinerede STL-klasser. De har allesammen også den fordel at de kan fanges i den samme catch-blok.

#include <stdexcept>
bool somefunc(int *param)
{
  try
  {
      if(param == 0)
        throw std::invalid_argument("'param' er ugyldigt");
      if(noget gejl med en socket fejler)
        throw std::runtime_error("sucker socket");
  }
  catch(std::invalid_argument &ia)
  {
      // ikke en alvorlig fejl
      return false;
  }
  catch(std::exception &e)
  {
      // alvorlig fejl
      throw;
  }
}
Avatar billede segmose Nybegynder
19. august 2008 - 12:08 #7
Doh, Ja jeg mente
throw OvSocketException("oh noes!");
Avatar billede arne_v Ekspert
30. august 2008 - 01:55 #8
oddi ?
Avatar billede oddi Nybegynder
30. august 2008 - 13:37 #9
sry jeg fik lige meget travlt! jeg kigger på det i dag eller i morgen. Tak for tålmodigheden.
Avatar billede arne_v Ekspert
28. oktober 2008 - 03:13 #10
?
Avatar billede oddi Nybegynder
28. oktober 2008 - 08:44 #11
Smid svar arne
Avatar billede arne_v Ekspert
28. oktober 2008 - 14:12 #12
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester