exception klasse schreiben
-
Hallo Leute.
Ich brauche eine Exception Klasse. Der Ctor nimmt 4 Parameter und daraus will ich jetzt eine Zeichenkette machen - aber wie?
Eigentlich habe ich bisher immer mittels stringstream einen string erstellt - aber da kann ja bad_alloc fliegen (da irgendwo new verwendet wird) - und eine Exception darf doch keine exception auslösen, oder?
wie löst ihr das?
-
Shade Of Mine schrieb:
Hallo Leute.
und eine Exception darf doch keine exception auslösen, oder?Wieso nicht ?
Devil
-
@Devil
Wenn eine Exception unterwegs ist und noch eine fliegt wird das Programm terminiert. (exit terminate weiß nicht mehr).Nu würde mich interessieren ob man das verhindern kann in dem man in der Exceptionklasse einen try catch Block aufnimt und alle Exceptions die man selbst verursacht abfängt und nicht nach aussen dringen lässt.
-
und eine Exception darf doch keine exception auslösen, oder?
Doch darf sie. Nur wenn eine Exception *während* des Stackunwindings einer anderen Exception ausgelöst wird, wird automatisch terminate aufgerufen.
Sowas ist aber ok:
const string Exception::notString_ = "Sorry Du! Ich hatte nicht mal genug Speicher zum Stringbauen. Echt doof, wa?"; Exception::Exception(Parameter) { try { makeString(Parameter);} catch(const bad_alloc&) { fprintf(stderr, "%s\n", notString_.c_str(); } }
Blöd ist natürlich, dass du keine Möglichkeit hast, den String sicher an eine konkrete std::exception-Klasse zu übergeben. Zumindest nicht, solange die Erzeugung des Strings eine Exception schmeißen kann.
Mögliche Lösung:
Speicherbereich vorher (beim Programmstart) reservieren.
-
HumeSikkins schrieb:
Doch darf sie. Nur wenn eine Exception *während* des Stackunwindings einer anderen Exception ausgelöst wird, wird automatisch terminate aufgerufen.
Oh, danke! Das wusste ich nicht.
Blöd ist natürlich, dass du keine Möglichkeit hast, den String sicher an eine konkrete std::exception-Klasse zu übergeben. Zumindest nicht, solange die Erzeugung des Strings eine Exception schmeißen kann.
Was hältst du davon:
char const* buildMessage(char const* a, char const* b) { char* str=0; try { str=new char[strlen(a)+strlen(b)+1]; strcpy(str,a); strcpy(str+strlen(a), b); } catch(bad_alloc&) { str="no memory for detailed exception information"; } catch(...) { str="something wired happened"; } return str; } char const* str; protected: bool is_base; public: Exception(const char* par1, const char* p2) : std::exception(buildMessage(par1, par2), str(what()), is_base(false) {} ~Exception() { if(!is_base && strcmp(str, "no memory for detailed exception information") && strcmp(str, "something wired happened") delete [] str; }
Problem:
Man muss, wenn man von Exception erbt is_base auf true setzen - und das ist echt ungut.Mögliche Lösung:
Speicherbereich vorher (beim Programmstart) reservieren.gefällt mir garnicht... da doch lieber ein static array in buildMessage...
Was eigentlich keine schlechte Idee ist - was hältst du von static arrays?
Schliesslich kann buildMessage() nicht 2mal aufgerufen werden, denn nur Exception::Exception() ruft es auf -> und EXception::Exception() kann auch nicht 2 mal aufgerufen werden...
-
Was treibt man nicht alles für Aufwand, um ein nicht-vorhandenes Problem zu lösen
-
Wieso nich vorhanden ? *interresiert schau*
-
Was treibt man nicht alles für Aufwand, um ein nicht-vorhandenes Problem zu lösen
Besonders da sich das Problem nicht lösen lässt. Die konkrete std::exception-Klasse wird in der Regel ein eigenes Stringobjekt verwalten. D.h. selbst wenn man für seine eigene Nachricht genügend Speicher hat, kann immer noch durch das Kopieren ein Speicherproblem auftreten
-
Knuddlbär: http://www.gotw.ca/publications/mill16.htm
-
thx
-
Ich als Anfänger stelle mir hier die Frage ob es wirklich so schlimm wäre, wenn
diese zweite Exception nicht gefangen wird, denn wenn der Speicher nichteinmal
mehr ein paar bytes für nen String übrig hat, steht der PC doch eh kurz vor
nem Absturz o.ä.
-
Siehe verlinkter Artikel *hmpf*
-
Problem bloß, das die Exception nicht wieder zerstört werden kann, wenn im Konstruktor eine Exception geflattert ist (jedenfalls hab ich das so verstanden)
mfg Glamdring
-
Wenn ein ctor eine Exception generiert, gilt das Objekt als nicht erzeugt. Etwas nicht existentes kann auch nicht zerstört werden.
-
Bashar schrieb:
Wenn ein ctor eine Exception generiert, gilt das Objekt als nicht erzeugt. Etwas nicht existentes kann auch nicht zerstört werden.
Oder auch so
mfg
Glamdring