Heim > Artikel > Backend-Entwicklung > Wann sollten Sie __try anstelle von try/catch/finally in C verwenden?
Ausnahmen in C: __try vs. try/catch/finally
In C werden die try/catch/finally-Konstrukte zur Behandlung verwendet Ausnahmen. Sie können jedoch auch mit Unterstrichen wie __try angetroffen werden. Dies wirft die Frage auf, wann diese Unterstriche notwendig sind.
Auf Windows-Plattformen: Vereinheitlichung der Ausnahmebehandlung
Unter Windows werden Ausnahmen auf Betriebssystemebene durch Structured Exception unterstützt Handhabung (SEH). Sie sind vergleichbar mit Unix-Signalen. Compiler, die auf Windows abzielen, nutzen SEH, um C-Ausnahmen zu implementieren.
Nicht standardmäßige __try und __exclusive
Um SEH-Ausnahmen in C zu behandeln, müssen Sie das nicht standardmäßige Schlüsselwort __try verwenden statt es zu versuchen. Das Schlüsselwort __exclusive ähnelt dem C-Schlüsselwort, bietet jedoch zusätzliche Funktionalität. Sie können damit einen Ausnahmefilterausdruck angeben, der bestimmt, ob eine aktive Ausnahme abgefangen werden soll.
__finally für die Codeausführung nach der Ausnahme
Das Schlüsselwort __finally ermöglicht Ihnen dies Code ausführen, nachdem eine Ausnahme behandelt wurde. Diese Funktion ist im Standard-C nicht vorhanden, aber in anderen Sprachen üblich.
Optimierung für Destruktoraufruf deaktivieren
Der Microsoft-Compiler führt eine Optimierung durch, die Destruktoren verhindern kann in allen Fällen beim Stapelabwickeln nicht aufgerufen werden. Wenn festgestellt wird, dass innerhalb des Bereichs, der die Lebensdauer des Objekts bestimmt, kein Wurf erfolgt, wird der Registrierungscode übersprungen. Um den Aufruf des Destruktors sicherzustellen, verwenden Sie die Kompilierungsoption /EHa, um diese Optimierung zu unterdrücken.
Beispiel zur Demonstration der SEH- und C-Ausnahmebehandlung
Zur Veranschaulichung der Konzepte finden Sie hier einen Codeausschnitt Das zeigt, wie SEH-Ausnahmen den Aufruf von C-Destruktoren ermöglichen und wie C-Ausnahmen auf SEH aufbauen:
#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; }
Ausgabe:
Filtering c0000005 destructed caught Filtering e06d7363 destructed caught
Dieses Beispiel zeigt die Behandlung von SEH- und C-Ausnahmen und demonstriert, wie Destruktoren auch während SEH-Ausnahmen aufgerufen werden.
Das obige ist der detaillierte Inhalt vonWann sollten Sie __try anstelle von try/catch/finally in C verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!