PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : std::runtime_error(): Keine Ausgabe der Fehlermeldung



BLUESCREEN3D
25-11-2007, 20:25
throw std::runtime_error("fehlerbeschreibung");

Wenn ich ein Programm mit dieser Zeile mit gcc 4.1.2 unter Fedora kompiliere und der Fehler auftritt, dann erscheint folgende Ausgabe:

terminate called after throwing an instance of 'std::runtime_error'
what(): fehlerbeschreibung
Aborted

Wenn ich das ganze mit gcc 3.2.3 unter Debian kompiliere fehlt die Beschreibung - die Ausgabe sieht einfach so aus:

Aborted

Liegt das nun nur an der älteren gcc-Version oder hat das noch andere Gründe?
Wenn die Meldung nicht ausgegeben wird, bringt mir das irgendwie wenig ...

locus vivendi
26-11-2007, 14:04
Die zweite Meldung verrät eigentlich was los ist: Die terminate-Funktion wird aufgerufen, weil versucht wird, eine Ausnahme weiterzuleiten an einer Stelle an der die normale C++ Ausnamebehandlung nicht fortgesetzt werden kann. Z.b. könnte es sein, dass eine Ausnahme die main-Funktion verlassen würde. Weitere Möglichkeiten zählt der C++-Standard auf in Abschnitt 15.5.1 [except.terminate].

Je nach konkretem Fall kannst du das Problem einfach dadurch lösen, dass du einen eigenen Handler schreibst (also ein "try { [...] } catch([...]) { [...] } Konstrukt) in dem du selber die what-Meldung ausgibst.

Falls dir das so nicht weiterhilft, kannst du ja Code posten.

BLUESCREEN3D
26-11-2007, 19:52
Die zweite Meldung verrät eigentlich was los ist: Die terminate-Funktion wird aufgerufen, weil versucht wird, eine Ausnahme weiterzuleiten an einer Stelle an der die normale C++ Ausnamebehandlung nicht fortgesetzt werden kann. Z.b. könnte es sein, dass eine Ausnahme die main-Funktion verlassen würde. Weitere Möglichkeiten zählt der C++-Standard auf in Abschnitt 15.5.1 [except.terminate].
Daran wirds wohl liegen. Die Exception verlässt im Endeffekt main(), weil ich die bisher nicht auffangen will, sondern das Programm einfach abbrechen soll.
Ich hatte es nur so in Erinnerung, dass es da noch einen Standardhandler oder so gibt, aber in 15.5.1 steht ja, dass stattdessen std::terminate() aufgerufen wird ...

Eigentlich will ich aber nicht den gesamten Inhalt von main() in einen try-catch-Block packen. Oder ist das so üblich, wenn bei jeder Exception eine Meldung ausgegeben werden soll?
Ansonsten: Könnte std::set_terminate() dabei weiterhelfen?

locus vivendi
28-11-2007, 13:36
Meine Antwort kommt etwas spät, leider kann ich dir auch nichts konkretes sagen.

Eigentlich will ich aber nicht den gesamten Inhalt von main() in einen try-catch-Block packen. Oder ist das so üblich, wenn bei jeder Exception eine Meldung ausgegeben werden soll?
Ich glaube, das ist durchaus so üblich.

Ansonsten: Könnte std::set_terminate() dabei weiterhelfen?
Potentiell ja, aber alle Wege diese Funktion dazu benutzen mehr über die Exception auszugeben sind meines Wissens plattform-spezifisch. Für die alte GCC 3.2.3 Version kannst du möglicherweise den GCC eigenen "verbose_terminate_handler" nutzen:
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/namespace____gnu__cxx.html#a12