Try Catch Frage
-
leo aka qsch schrieb:
sag mal fuer was brauchst du es?
Nun ja ich will über Windows Sockets Daten empfengen und mit if und switch Anweisungen auswerten, wenn es dabei zu einer unvorhergesehenen Exception kommt soll die abgefangen werden.
Aha, und was macht diese what genau??
-
bigborre schrieb:
Aha, und was macht diese what genau??
Naja, Du kannst damit sowas machen:
throw std::exception("Achtung: Besonders boese Ausnahme geworfen!");
Und wenn Du die dann auffängst, dann gibt ein what()-Aufruf diesen Text zurück.
-
[quote="nman"]
bigborre schrieb:
throw std::exception("Achtung: Besonders boese Ausnahme geworfen!");
es ist leder nicht portabel, da std::string keinen constructor hat, der const char* nimmt:
18.6.1 Class exception [lib.exception]
namespace std { class exception { public: exception() throw(); exception(const exception&) throw(); exception& operator=(const exception&) throw(); virtual ˜exception() throw(); virtual const char* what() const throw(); }; }
-
d.h. man kann std::exception nicht direkt verwenden?
-
ssm schrieb:
es ist leder nicht portabel, da std::string keinen constructor hat, der const char* nimmt:
Das war nicht "nicht portabel", das war schlichtweg falsch.
std::string hat übrigens einen Konstruktor für const char*, std::exception hingegen nicht. :pAber dann verwendet man einfach std::runtime_error oä, ist ja auch eine std::exception.
-
simon.phoenix schrieb:
d.h. man kann std::exception nicht direkt verwenden?
genau
-
Wie bereits gesagt: runtimer_error, logic_error und Co. verschaffen Abhilfe.
-
Hmm,
gar nicht mal so einfach.
noch mal zum Verständnis:catch(exception &ex) { cerr<<ex.what(); }
Wo stehen jetzt die informationen über meine Excetion?
-
bigborre schrieb:
Hmm,
gar nicht mal so einfach.
noch mal zum Verständnis:catch(exception &ex) { cerr<<ex.what(); }
Wo stehen jetzt die informationen über meine Excetion?
in cerr
-
hmm, ja logisch
Manchmal sieht man den Wald vor Bäumen nicht.
-
Ok, ich hab jetzt die Infos zur Exception in cerr.
Kann ich das jetzt in einen String umwandeln?char buffer[200]: sprintf(buffer, cerr);
dachte ich, funktioniert aber nicht.
-
bigborre schrieb:
Ok, ich hab jetzt die Infos zur Exception in cerr.
Kann ich das jetzt in einen String umwandeln?char buffer[200]: sprintf(buffer, cerr);
dachte ich, funktioniert aber nicht.
catch(const exception &ex)
{
std::string errorMessage(ex.what());
}
-
???
hä, wie funktioniert das?
wo steht dann mein String drin?
-
Im std::string errorMessage. Da wurd dem Konstruktor der Rückgabewert von what() übergeben.
-
ok, ich glaub ich bin dafür zu blöd, angenommen ich möchte ex.what() in einen sting speichern und ausgeben, wie geht das
sting s; . . . catch(exception &ex) { string=ex.what(); cout<<s<<endl; }
so?
-
bigborre schrieb:
so?
ja, aber wozu brauchst du noch sting s?
einfach so geht eigentlich auch:catch(const exception &ex) { cout << ex.what() << endl; }
-
nein, es muss heißen:
string s; . . . try {} catch(exception &ex) { s = ex.what(); //oder, das was äquivalent ist nur halt schneller geht: string exception (ex.what()); // Aufruf des Konstruktors von string und // Erzeugung von "exception" -> in exception steht die Fehlermeldung cout << s << endl; //oder cout << exception << endl; }
-
Ok, mein eigentliches Problem, der Fehler soll in einer Messagebox ausgegeben werden
catch(exception& ex) { ex.what(); MessageBox( NULL, ex.what(),"Fatal Error" , MB_OK ); }
Alles funktioniert, bloß bei dem zweiten Parameter bringt er mir immer einen Fehler.
EDIT: @viande so geht es auch nicht, in exception steht kein String.
-
[quote="bigborre"]Alles funktioniert, bloß bei dem zweiten Parameter bringt er mir immer einen Fehler.
/quote]und so:
[cpp]catch(const exception& ex)
{
::MessageBoxA( NULL, ex.what(), "Fatal Error" , MB_ICONERROR );
}[/cpp]?
man braucht die Fehlermeldung, um etwas genaues zu sagen
-
Ne, hat nix gebracht hier mal die fehlermeldung:
error C2664: 'MessageBoxA' : Konvertierung des Parameters 2 von 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' in 'const char *' nicht moeglich
Vielleicht weil ich ohne Klassen arbeite?