Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Frage zu Exceptions - const char *

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.12.2005, 10:21 Uhr
~maxpower24
Gast


Hallo,

ich habe mal eine einfache Frage zu Exception bzgl der Überschreibung der Methode what().

Also ich habe mir eine Exceptionhierarchie ausgedacht, bei der alle Exceptions von der C++-Klasse exception abgeleitet sind. Diese hat ja eine virtuelle Methode what(), die ein const char * zurückgibt.

Folglich hat die abstrakte Oberklasse meiner Hierarchie (AbstractExcetion) einen Konstruktor, in dem ein const char * übergeben wird. Die what()-MEthode habe ich dort wie folgt überschriebn:

const char * AbstractException::what(void) const throw(){
return this->errormessage;
}

Soweit, so gut. Ich will jetzt von dieser abstrakten Klasse weitere (selbstdefinierte) Exceptions ableiten, die jeweils die what()-MEthode überschreiben, sodass vor dem errormessage-string noch ein Identifyervorangestellt wird...z.b. "ConcreteExcA: Habe Fehler gefangen...."

Meine Überschreibung wollte ich irgendwie so machen:
const char * ConcreteExcA::what(void) const throw(){
return "ConcreteExcA:" << AbstractException::what();
}

Jetzt kriege ich Compilerfehler, weil << irgendwie nicht mit const char * arbeiten will.....wie kann ich denn das umgehen???...Ich hätte für das errormessage-member eh lieber die Klasse string benutzt, aber das passt ja dann nicht mehr mit der Signatur von what() zusammen....was kann man denn da machen??? Hat jemand ne Idee ?

VIELEN DANK!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.12.2005, 10:54 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn man es so machen will, wie Du, dann:

C++:
class ConcreteException: public AbstractException {

    mutable std::string message;

public:

    const char* what() const throw() {
        message = "ConcreteException: ";
        messgae += AbstractException::what();
        return message.c_str();
    }

};


Wichtig ist, daß message wirklich member ist, nicht etwa eine lokale Variable. Generell solltest Du allerdings davon absehen, in what sowas wie Objekte zu benutzen, welche selbst Exceptions auslösen können: mit dem throw() versprichst Du ja, daß keine Exception geworfen wird; die Stringaddition kann aber potentiell eine std::bad_alloc exception werfen.

Eine mögliche Alternative ist ein wenig eklig:

C++:
class ConcreteException: public AbstractException {

    mutable char* message;
    mutable size_t len;

private:
    const char* createMessgae() const throw() {
       static const char[] fixedText = "ConcreteException: ";
       const char* msg = AbstractException::what();
       size_t length  = sizeof(fixedText)+std::strlen(msg);
       if (length>len) {
           delete[] message;
           message = NULL;
           len = 0;
           message = new(nothrow) char[length];
           if (message==NULL) {
               return msg; // Fallback: Exception message der Basisklasse, alternativ:
               return "not enough memory to generate error message!";
           }
           len = length;
       }
       std::strcpy(message, fixedText);
       std::strcat(message, msg);
       return message;
    }

public:

   ConcreteException( ... ) {
        message = NULL;
        len = 0;
   }

    ~ConcreteException() {
          delete [] message;
    }
    const char* what() const throw() {
        return createMessage();
    }

};


Entscheide bitte selbst, ob Du das für paranoid hälst. Die erste Variante ist eben bestechend einfach, aber nicht exceptionsicher, letztere ist exceptionsicher, aber eben deutlich komplizierter.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 06.12.2005 um 10:56 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.12.2005, 12:46 Uhr
~maxpower24
Gast


BESTEN DANK!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: