__try und try/catch/finally in C
In C wird die Ausnahmebehandlung hauptsächlich durch die try/catch/finally-Blöcke erreicht. Es gibt jedoch weniger bekannte Befehle, die mit doppelten Unterstrichen beginnen, wie zum Beispiel __try. Dieser Artikel soll klären, wann diese Unterstriche notwendig sind.
Auf Windows-Systemen werden Ausnahmen durch Structured Exception Handling (SEH) unterstützt, einen Mechanismus auf Betriebssystemebene. Compiler nutzen diese SEH-Infrastruktur normalerweise für die Implementierung von C-Ausnahmen. Die Schlüsselwörter „throw“ und „catch“ behandeln ausschließlich C-Ausnahmen, wobei der entsprechende SEH-Ausnahmecode 0xe06d7363 lautet.
Um SEH-Ausnahmen zu behandeln, erfordern C-Programme die Verwendung des nicht standardmäßigen Schlüsselworts __try. Darüber hinaus ähnelt __exclusive „catch“, ermöglicht jedoch die Angabe eines Ausnahmefilters, um zu bestimmen, ob eine aktive Ausnahme behandelt werden soll. __finally aktiviert die Codeausführung nach der Ausnahmebehandlung.
Um diese Konzepte zu veranschaulichen, betrachten Sie das folgende Beispielprogramm:
#include <windows.h> #include <iostream> class Example { public: ~Example() { std::cout << "destructed" << std::endl; } }; int filterException(int code, PEXCEPTION_POINTERS ex) { std::cout << "Filtering " << std::hex << code << std::endl; return EXCEPTION_EXECUTE_HANDLER; } void testProcessorFault() { Example e; int* p = 0; *p = 42; } void testCppException() { Example e; throw 42; } int main() { __try { testProcessorFault(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } __try { testCppException(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; }
Das obige ist der detaillierte Inhalt vonWann sollten Sie in C „__try' und „__exclusive' anstelle von „try' und „catch' verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!