Exception Handling bei abgeleiteten Klassen von exception
-
Nunja, das eine hat mit dem anderen so viel nicht zu tun. Du fängst eine Referenz auf ein Objekt. Wie dieses Objekt zu erzeugen ist (beim werfen) hängt einzig und allein davon ab, wie man es erzeugen kann. Wenn Du einen nicht vorhandenen Konstruktor aufrufst, wird Dir das schon der Compiler sagen. Beim Fangen hat die Anzahl der Parameter des Konstruktors keinerlei Relevanz.
Beispiel:
struct TestEx : public runtime_error { TestEx( string name, string wert ): // zwei Parameter runtime_error( name + " = " + wert ) // runtime_error hat nur einen {} }; int main() { try { //throw exception(); throw runtime_error( "ein parameter" ); //throw TestEx( "farbe", "grün" ); // wahlweise einen dieser drei entkommentieren } catch ( exception const& ex ) { cout << ex.what() << endl; } }(Ohne Rücksicht auf Namespaces und Header
)
-
#include<iostream> #include<stdexcept> #include<conio.h> using namespace std; class eC_Beispiel : exception{}; int main() { try { throw eC_Beispiel(); } catch(exception& test) { cout << test.what(); } catch(...) { cout << "hier wird gefangen :("; } getch(); return 0; }und nochmal, also ich hab jetzt die Bestätigung. Die Ausnahme wird nicht von der Zeile
catch(exception& test)
gefangen, keine Ahnung warum, ist mir total schleierhaft. Obwohl "exception" ja die Basisklasse ist.
-
LordJaxom schrieb:
Nunja, das eine hat mit dem anderen so viel nicht zu tun. Du fängst eine Referenz auf ein Objekt. Wie dieses Objekt zu erzeugen ist (beim werfen) hängt einzig und allein davon ab, wie man es erzeugen kann. Wenn Du einen nicht vorhandenen Konstruktor aufrufst, wird Dir das schon der Compiler sagen. Beim Fangen hat die Anzahl der Parameter des Konstruktors keinerlei Relevanz.
Ah gut ich denke ich habs verstanden, what() liefert nur dann den Klassennamen zurück, wenn kein Wert hinterlegt ist ^^
-
Leite die Klasse mal public von exception ab.
-
LordJaxom schrieb:
Leite die Klasse mal public von exception ab.
*groschen runterfall*
OMFG
Danke, dass ist wirklich nen Blödheitsfehler, eigentlich hab ichs die ganze Zeit vorher genau so gemacht, nur beim testen grad verrafft ^^°°°°°°°°°°°°°°°

-
Noch eine Frage die mir grade eingefallen ist:
Es ist durchaus sinnvoll, auch eigene Ausnahmen von exception abzuleiten. Dazu muss die Funktion what() implementiert werden, da diese virtuell ist.
Das stand in einer Tutorialquelle, und bezog sich darauf, what() komplett neu in die abgeleite Klasse aufzunehmen. Stimmt das? ich meine bei mir funktioniert dass einfach so über die Vererbung ohne für mich erkkenbare Probleme.
-
Wenn Du z.B. von runtime_error ableitest, hast Du bereits eine geeignete Implementierung von what() geerbt. Nämlich die, die den String den Du im Konstruktor übergibst zurückgibt.
Die Klasse exception hat allerdings nur eine virtuelle Methode what(), die einen implementation-defined String zurückgibt. Wenn Du eine sinnvolle Nachricht darüber empfangen willst, musst Du what() überschreiben und entsprechend implementieren.
Ich persönlich halte es jedoch für sinnvoll, statt von exception direkt von runtime_error oder logic_error abzuleiten, aus oben genanntem Grund. runtime_error, wenn es sich wirklich um eine Exception handelt, die zur Laufzeit auftreten _kann_, aber nicht _sollte_, und logic_error, wenn es sich um eine nicht abgefangene Fehlbenutzung (also eigentlich Programmierfehler) handelt.
-
Seh ich das richtig:
Wenn ich über exception fange, bekomme ich per what nur grob um was es sich dreht und wenn ich runtime_error abfrage genaueres mitgeteilt?
Im Fall einer leeren Fehlerklasse wird dann der Name selbiger zurück geliefert, im Fall einer erweiterten/gefüllten Fehlerklasse bekomm ich nur das zurück, was ich per Parameter beim Wurf übermittelt hab?
-
Anders:
Du bekommst von what() das zurück, was die Implementierung von what() Dir zurückgibt. Im Falle von runtime_error ist das der String, den Du dem Konstruktor übergibst (also im Grunde was immer Du willst wenn Du selbst ableitest), im Falle von exception ist das implementation-defined.In diesem Falle ist das wohl eine Typinformation, also der Klassenname. Implementation-defined heisst aber dass Du Dich darauf nicht verlassen kannst, d.h. jeder andere Compiler (bzw. Standardbibliothek) kann das anders handhaben.
EDIT:
Das hängt allerdings nicht davon ab was du fängst, sondern davon was Du wirfst. Deshalb ist what() ja virtuell.
-
mit andern worten: wenn ich what() nicht selbst in meine klasse implementiert habe ist es vollkommen egal was ich mache, wenn mein fehlerobjekt dann what() aufruft, gibt er mir zurück wies in der klasse "exception" definiert wurde, mit andern worten, es erscheint u.a. der klassenname.
-
Wenn Du von runtime_error (bzw. logic_error) ableitest bekommst Du den String zurück, auch wenn Du eine exception fängst. Weil what() virtuell ist. Wenn Du von exception direkt ableitest: ja

-
Dankeschön für das geduldige Antworten

Das wärs erstmal von mir, mir fallen grade keine "dummen Fragen" mehr ein ^^