2010-12-06 16 views
7

Kann ich die globale Ausnahmebehandlung in C++ implementieren? Meine Anforderung ist try ... Catch-Block wird nicht in einem Stück Code verwendet, dann sollte es einen globalen Ausnahme-Handler geben, der alle nicht abgefangenen Ausnahmen behandeln wird.Globale Ausnahmebehandlung in C++

Kann ich es erreichen, geben Sie bitte Ihre wertvollen Vorschlag :)

+3

Es gibt keine Versuche ... Blöcke in C trotzdem zu fangen. Denkst du vielleicht an C++? –

+0

Danke Karl, ich habe es in C++ geändert. –

+0

Dieser MSDN-Forum-Thread könnte einige nützliche Links enthalten: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/99cbe120-d8a9-448f-b827-8b61ca0a6a27 –

Antwort

1

Sie eine Kombination aus set_terminate verwenden können und current_exception()

4

In C++ die terminate Funktion aufgerufen wird, wenn eine Ausnahme nicht abgefangene ist. Sie können Ihren eigenen Terminierungshandler mit der Funktion set_terminate installieren. Der Nachteil ist, dass Ihr Abbruch-Handler möglicherweise nie zurückkehrt; Sie müssen Ihr Programm mit einem Betriebssystemgrundelement beenden. Der Standardwert ist nur abort()

+2

Sorry, aber ich bin ein C# -Programmierer. Also wenn du ein Codeprobe geben kannst damit es mir helfen kann. Vielen Dank im Voraus :) –

0

Wenn eine Ausnahme ausgelöst wird, wenn nicht an diesem Punkt gefangen wird, geht es die Hierarchie hoch, bis es tatsächlich gefangen wird. Wenn für die Ausnahme kein Code vorhanden ist, wird das Programm beendet.
Sie können bestimmten Code ausführen, bevor Beendigung Bereinigung zu tun, indem Sie Ihre eigenen Handler von set_unexpected oder set_terminate

+0

Um diese und alle anderen Antworten über set_terminate: Wenn die Ausnahme nicht im catch-Block behandelt wird, wird der Prozess noch beendet. –

3

ich mit der äußersten Funktion in einem Try-Catch wie dies immer wickelt:

int main() 
{ 
    try { 
     // start your program/function 
     Program program; program.Run(); 
    } 
    catch (std::exception& ex) { 
     std::cerr << ex.what() << std::endl; 
    } 
    catch (...) { 
     std::cerr << "Caught unknown exception." << std::endl; 
    } 
} 

Dieser Wille Fange alles. Bei der guten Ausnahmebehandlung in C++ geht es nicht darum, try-catch überall zu schreiben, sondern um herauszufinden, wo man weiß, wie man damit umgeht (so wie es scheint). In diesem Fall besteht die einzige Möglichkeit darin, die Fehlermeldung in stderr zu schreiben, damit der Benutzer darauf reagieren kann.

+0

Daniel, es gibt verschiedene Arten von Ausnahmen, die nicht von Catch (...) abgefangen werden, besonders wenn Sie VC++ verwenden, das zwischen strukturierter und unstrukturierter Ausnahmebehandlung unterscheidet. – Jaywalker

+0

Aber das sind keine C++ - Ausnahmen. (und die äquivalenten Fehler in Linux werden auch nicht durch einen Versuch/Fang gefangen) – jalf

+0

Nun, das Plakat sagte nur, dass er C++ benutzte. Plattformspezifische Besonderheiten wurden nicht erwähnt. –