ホームページ  >  記事  >  バックエンド開発  >  C で `try` と `catch` の代わりに `__try` と `__Except` を使用する必要があるのはどのような場合ですか?

C で `try` と `catch` の代わりに `__try` と `__Except` を使用する必要があるのはどのような場合ですか?

DDD
DDDオリジナル
2024-11-07 22:22:03376ブラウズ

When Should You Use `__try` and `__except` Instead of `try` and `catch` in C  ?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。