Try Catch Frage
-
[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?
-
Nein, sondern weil WinAPI C ist und const char * erwartet, du aber mit std::string arbeitest. Deshalb musst du noch string::c_str() aufrufen, um den String umzuwandeln.
ex.what().c_str();
-
bigborre schrieb:
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?
[cpp]string s;
.
.
.
try
{
}
catch(exception &ex)
{
s = ex.what();::MessageBoxA( NULL, s.c_str(), "Fatal Error" , MB_ICONERROR );
}[/cpp]