C Try/Catch/Finally ブロックと __try キーワード
構造化例外処理 (SEH) は、オペレーティング システム レベルの例外処理メカニズムです。 Windows でサポートされています。 Windows 用コンパイラは、通常、SEH を利用して C 例外を実装します。
C キーワードの throw および catch は C 例外を排他的に処理しますが、Microsoft Visual C (MSVC) コンパイラには、SEH 例外を処理するための非標準の __try および __Except キーワードが用意されています。
__try ブロック:
非標準の __try ブロックは、C の try ブロックと同様に、例外が発生する可能性のあるスコープを定義します。
__Except ブロック:
__Except ブロックは C の catch ブロックに似ていますが、より柔軟性があります。これには、アクティブな例外を処理する必要があるかどうかを評価する例外フィルター式があります。
__finally ブロック:
__finally ブロックには、例外処理の後に実行されるコードが含まれています。これは C# の Finally ブロックに似ていますが、標準 C では直接同等ではありません。
__try ブロックの使用例:
SEH 例外には、オペレーティング システムによって生成された例外が含まれる場合があります。システム、SEH を使用した相互運用コード、または「.NET」例外コードを使用したマネージ コード。 C でこれらの例外をキャッチするには、__try ブロックを __Except ブロックとともに使用する必要があります。
サンプル プログラム:
サンプル プログラムは、SEH 例外と C デストラクターの使用方法を示します。 SEH 例外の巻き戻し中に呼び出されます。
#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; }
出力:
Filtering c0000005 destructed caught
以上がC で __try キーワードを使用する必要があるのはいつ、なぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。