Code: Alles auswählen
return MyStream.str().c_str();
Code: Alles auswählen
catch (const std::exception &e)
{
IrgendeineErrorFunktion(e.what());
}
Nun vermute ich mal ganz stark dass zwischen dem Werfen und dem Fangen der Exception irgendwas kaputt geht, wobei das what() ja eigentlich erst im catch-Block aufgerufen wird. Aber da wird ja kein Code mehr danach ausgeführt, daher denk ich die Exception ist irgendwie ein wenig kaputt. Da ich allerdings nicht so in der Exception-Materie drin stecke und hier sicherlich einige mehr Ahnung haben, wollt ich mal in die Runde fragen, ob jemand eine Idee hat was das sein könnte. Genauer würde mich interessieren wo das ganze im Speicher liegt. Also beispielsweise ob es wahrscheinlicher ist, dass der Code vor dem Werfen der Exception gefährlich zu Leibe rücken könnte oder eher der Code nahe des Fangens und so Sachen.
Es ist nämlich recht schwer das ganze vernünftig zu debuggen. Ich sehe nicht wirklich was da im Hintergrund während des Werf-Fang-Spiels passiert und habe leider, wie schon erwähnt, zu wenig Hintergrundwissen.
Danke für Hinweise.
Hier noch einige Informationen:
- Visual Studio 2008
- Windows 7 Enterprise 32 Bit
- this-Pointer im what()-Aufruf: 0x0031e70c (Member haben die gewünschten Werte, std::runtime_error::what()-Aufruf liefert gewünschten Wert)
- Inhalt von e im catch-Block {_m_what=0x00000000 <Bad Ptr> _m_doFree=0 } const std::exception &
(Verwirrt mich etwas) - Error-Funktion
Code: Alles auswählen
void Error(const std::string &error) { ::MessageBoxA(0, error.c_str(), "Error", MB_ICONERROR | MB_OK); }
- Catch-Block
Code: Alles auswählen
catch (const std::exception &e) { ct::os::Error(e.what()); // Obige Error-Funktion befindet sich im namespace ct::os }
- Exception-Klasse
Code: Alles auswählen
class recipe_error : public std::runtime_error { public: recipe_error(const std::string &file, size_t line, const std::string &error) throw() : std::runtime_error(error), File(file), Line(line), UseLine(true) { } recipe_error(const std::string &file, const std::string &error) throw() : std::runtime_error(error), File(file), Line(0), UseLine(false) { } virtual ~recipe_error() throw() { } virtual const char* what(void) const throw() { std::ostringstream Error; Error << File; if (UseLine) Error << " (" << Line << ")"; Error << ": " << std::runtime_error::what(); return Error.str().c_str(); } private: std::string File; size_t Line; bool UseLine; };