Heim >Backend-Entwicklung >C++ >Wann sollten Sie __try anstelle von try/catch/finally in C verwenden?

Wann sollten Sie __try anstelle von try/catch/finally in C verwenden?

DDD
DDDOriginal
2024-11-11 13:58:02526Durchsuche

When Should You Use __try Instead of try/catch/finally in C  ?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn