__try および try/catch/finally in C
C では、例外処理は主に try/catch/finally ブロックを通じて実現されます。ただし、__try など、あまり知られていない 2 つのアンダースコアで始まるコマンドもあります。この記事の目的は、これらのアンダースコアが必要な場合を明確にすることです。
Windows システムでは、例外はオペレーティング システム レベルのメカニズムである構造化例外処理 (SEH) によってサポートされます。通常、コンパイラは、C 例外の実装にこの SEH インフラストラクチャを利用します。 throw および catch キーワードは C 例外のみを処理し、対応する SEH 例外コードは 0xe06d7363 です。
SEH 例外を処理するには、C プログラムでは非標準の __try キーワードを使用する必要があります。さらに、__excel は catch に似ていますが、アクティブな例外を処理する必要があるかどうかを決定する例外フィルターを指定できます。 __finally は、例外処理後のコード実行を有効にします。
これらの概念を説明するために、以下のサンプル プログラムを考えてみましょう。
#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; } 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; }
以上がC で `try` と `catch` の代わりに `__try` と `__Except` を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。