ホームページ > バックエンド開発 > C++ > C で __try キーワードを使用する必要があるのはいつ、なぜですか?

C で __try キーワードを使用する必要があるのはいつ、なぜですか?

Mary-Kate Olsen
リリース: 2024-11-06 13:16:02
オリジナル
796 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート