C Try/Catch/Finally-Blöcke und das Schlüsselwort __try
Structured Exception Handling (SEH) ist der Ausnahmebehandlungsmechanismus auf Betriebssystemebene Unterstützt von Windows. Compiler für Windows verwenden in der Regel SEH, um C-Ausnahmen zu implementieren.
Während die C-Schlüsselwörter „throw“ und „catch“ ausschließlich C-Ausnahmen verarbeiten, stellt der Microsoft Visual C (MSVC)-Compiler nicht standardmäßige Schlüsselwörter __try und __exclusive zur Behandlung von SEH-Ausnahmen bereit.
__try-Block:
Der nicht standardmäßige __try-Block definiert den Bereich, in dem eine Ausnahme auftreten kann, genau wie ein try-Block in C. Es folgen die Blöcke __exclusive und __finally.
__exclusive-Block:
Der __exclusive-Block ähnelt einem Catch-Block in C, bietet jedoch mehr Flexibilität. Es verfügt über einen Ausnahmefilterausdruck, der auswertet, ob eine aktive Ausnahme behandelt werden soll.
__finally-Block:
Der __finally-Block enthält Code, der nach jeder Ausnahmebehandlung ausgeführt wird. Es ähnelt einem „finally“-Block in C#, ist aber nicht direkt äquivalent in Standard-C.
Anwendungsfall für __try-Blöcke:
SEH-Ausnahmen können solche umfassen, die durch den Betrieb generiert werden System, zusammenarbeitender Code mit SEH oder verwalteter Code mit dem Ausnahmecode „.NET“. Um diese Ausnahmen in C abzufangen, müssen __try-Blöcke zusammen mit __exclusive-Blöcken verwendet werden.
Beispielprogramm:
Das Beispielprogramm demonstriert SEH-Ausnahmen und wie C-Destruktoren sein können Wird während einer SEH-Ausnahme aufgerufen Abwickeln.
#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; } int main() { __try { Example e; int* p = 0; *p = 42; // intentially generating a processor fault } __except (filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; }
Ausgabe:
Filtering c0000005 destructed caught
Das obige ist der detaillierte Inhalt vonWann und warum sollten Sie das Schlüsselwort __try in C verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!