stream exceptions
-
Ich suche eine Möglichkeit exceptions in ofstream erst mal zu erzeugen und danach abzufangen.
Bis jetzt habe ich die beiden exceptions funktionen gefunden damit man streams mit exceptions kontrolieren kann - aber irgendwas klappt bei mir damit nicht.
Also ich erzeuge Logdatei und setze die maske für ofstream
Log::Log( ) { logS.exceptions ( std::ofstream::eofbit | std::ofstream::failbit | std::ofstream::badbit ); //set exception mask try { logS.open( "logFile.txt" ); // open log file } catch ( ... ) { printf ( "excp in c-tor" ); } }Das funktioniert auch - aber z.B. bei falscher Pfadangabe kommt trotzdem danach
Exception b Aborted (Core dumped)Also kommt irgendwas durch - aber wie? In main fange ich noch mal alles ab
int main () { try { Log::getLog( ).saveR( "hallo word" ); Log::getLog( ).saveR( "zeile 2" ); } catch (std::ofstream::failure e) { std::cout << "Exception " << *e.what( ) << std::endl; } catch ( ... ) { std::cout << "Exception" << std::endl; } }Eigentlich will ich nur wissen ob es gelungen ist den Datei zu erstellen oder nicht - falls jemanden was besseres einfällt, dann immer her damit. Am sonsten wie kann ich verhindern dass das ganze Programm abstürzt wenn es nicht gelingt den logFile zu erstellen?
-
mittlerweile habe ich es etwas geändert - aber das Problem besteht weiterhin
bool noLog = false; Log::Log( ) { logS.exceptions ( std::ofstream::eofbit | std::ofstream::failbit | std::ofstream::badbit ); //set exception mask try { logS.open( "logFile.txt" ); // open log file } catch ( ... ) { noLog = true; } } // restliches zeugs int main () { if ( noLog ) { printf ( "noLog" ); return 1; } try { Log::getLog( ).saveR ( "hallo word" ); Log::getLog( ).saveR( "zeile 2" ); } catch (std::ofstream::failure e) { std::cout << "Exception " << *e.what( ) << std::endl; } catch ( ... ) { std::cout << "Exception" << std::endl; } return 0; }nun kommt die ausgabe
noLog Aborted (Core dumped)Wieso Aborted? es geht doch schon bei
if ( noLog )raus!?
-
*e.what( )
das ist definitiv falsch
du hast doch nen debugger - nutz ihn halt mal...bb
-
ich kann das *what( ) ganz weg machen - es ändert sich nichts.
-
Feld schrieb:
ich kann das *what( ) ganz weg machen - es ändert sich nichts.
was sagt der debugger?
-
unskilled schrieb:
Feld schrieb:
ich kann das *what( ) ganz weg machen - es ändert sich nichts.
was sagt der debugger?
Was soll ich den fragen? Leider gibts da keinen "wieso erscheint Abort(core dumped)" Knopf
-
Feld schrieb:
unskilled schrieb:
Feld schrieb:
ich kann das *what( ) ganz weg machen - es ändert sich nichts.
was sagt der debugger?
Was soll ich den fragen? Leider gibts da keinen "wieso erscheint Abort(core dumped)" Knopf
Doch den gibt es.
Dieses Abort (core dumped) ist keine C++-Exception, die Du abfangen kannst, sondern ein harter Programmfehler. In der Regel ist es ein derefernzierter Zeiger, der auf einen Speicherbereich zeigt, welcher nicht dem Prozess gehört. Der Stacktrace im Debugger zeigt Dir genau die Stelle an, wo das passiert ist. Das tolle an diesem "core dumped" ist, dass das auch im nachhinhein geht. Du kannst dem Debugger sagen, dass er ein bestimmtes core-file verwenden soll. Dann siehst Du auch nachträglich, warum das Programm ausgestiegen ist.
Ein Fehler, der mir beim flüchtigen durchsehen Deines Programms auffällt ist, dass Du die Exception als Kopie und nicht als Referenz auffängst. Das sollte man nicht tun. Also mach lieber:
catch (const std::ofstream::failure& eOder noch besser:
catch (const std::exception& eDann fängst Du auch andere Exceptions auf.
Der nächste Fehler, der mir auffällt ist die Ausgabe von what(). Mach mal lieber
... << e.what() << ...Mit dem Stern vor dem e.what() gibts Du nur das erste Zeichen der Fehlermeldung aus. Das ist in der Regel nicht so informativ.