Heim  >  Artikel  >  Backend-Entwicklung  >  Wie funktioniert die strukturierte Ausnahmebehandlung (Structured Exception Handling, SEH) in C mit __try und try/catch/finally?

Wie funktioniert die strukturierte Ausnahmebehandlung (Structured Exception Handling, SEH) in C mit __try und try/catch/finally?

Barbara Streisand
Barbara StreisandOriginal
2024-11-07 13:11:03390Durchsuche

How Does Structured Exception Handling (SEH) Work in C   with __try and try/catch/finally?

Structured Exception Handling (SEH) in C mit __try und try/catch/finally

In C blockiert try/catch/finally Stellen Sie einen Mechanismus zur Behandlung von Ausnahmen innerhalb eines Codeblocks bereit. Unter Windows unterstützt der Compiler jedoch auch einen anderen Ansatz namens Structured Exception Handling (SEH).

Das Schlüsselwort __try ist ein nicht standardmäßiges Schlüsselwort, mit dem Sie SEH-Ausnahmen abfangen können. SEH-Ausnahmen werden auf Betriebssystemebene unterstützt und bieten eine Möglichkeit, Ausnahmen vom Betriebssystem selbst oder von Code abzufangen, der SEH zur Ausnahmebehandlung verwendet.

Mit dem Schlüsselwort __exclusive können Sie einen Ausnahmefilterausdruck angeben, der bestimmt, ob oder nicht, eine aktive Ausnahme sollte abgefangen werden. Dadurch können Sie bestimmte Arten von Ausnahmen selektiv behandeln.

Mit dem Schlüsselwort __finally können Sie Code hinzufügen, der ausgeführt wird, nachdem die Ausnahme behandelt wurde. Dies kann nützlich sein, um Bereinigungsaktionen durchzuführen, wie etwa das Freigeben von Ressourcen oder das Schließen von Dateien.

SEH-Ausnahmen werden zusätzlich zu C-Ausnahmen implementiert. C-Ausnahmen werden mit dem Schlüsselwort „throw“ ausgelöst und können mit dem Schlüsselwort „catch“ abgefangen werden. Wenn eine C-Ausnahme ausgelöst wird, erstellt der Compiler eine entsprechende SEH-Ausnahme, die von __try/__exclusive-Blöcken abgefangen werden kann.

Die EHa-Kompilierungsoption zwingt den Compiler, immer Code zu generieren, um die Destruktoren der erstellten Objekte zu registrieren im Rahmen eines Try-Blocks. Dadurch wird sichergestellt, dass Destruktoren auch beim Vorhandensein asynchroner SEH-Ausnahmen aufgerufen werden.

Um zu demonstrieren, wie SEH-Ausnahmen in C abgefangen werden können, betrachten Sie das folgende Programm:

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;
}

Wenn Sie dies ausführen Wenn Sie ein Programm mit gesetzter EHa-Kompilierungsoption ausführen, zeigt die Ausgabe, dass die Destruktoren der Beispielobjekte aufgerufen werden, auch wenn SEH-Ausnahmen ausgelöst werden. Dies zeigt, wie SEH-Ausnahmen und C-Ausnahmen gemeinsam im C-Code behandelt werden können.

Das obige ist der detaillierte Inhalt vonWie funktioniert die strukturierte Ausnahmebehandlung (Structured Exception Handling, SEH) in C mit __try und try/catch/finally?. 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