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. |