Heim >Backend-Entwicklung >C++ >Wann und warum sollten Sie das Schlüsselwort __try in C verwenden?

Wann und warum sollten Sie das Schlüsselwort __try in C verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-06 13:16:02803Durchsuche

When and Why Should You Utilize the __try Keyword in C  ?

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!

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