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

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

DDD
DDDオリジナル
2024-11-11 13:58:02527ブラウズ

When Should You Use __try Instead of try/catch/finally in C  ?

C の例外: __try と try/catch/finally

C では、try/catch/finally コンストラクトを使用して処理が行われます。例外。ただし、__try のようにアンダースコアが使用される場合もあります。このため、これらのアンダースコアがいつ必要になるかという問題が生じます。

Windows プラットフォーム: 例外処理の統合

Windows では、例外は構造化例外を通じてオペレーティング システム レベルでサポートされます。ハンドリング (SEH)。これらは Unix シグナルに相当します。 Windows をターゲットとするコンパイラは、SEH を利用して C 例外を実装します。

非標準 __try および __Except

C で SEH 例外を処理するには、非標準 __try キーワードを使用する必要があります。試す代わりに。 __excel キーワードは C の catch に似ていますが、追加の機能を提供します。アクティブな例外をキャッチするかどうかを決定する例外フィルター式を指定できます。

__finally 例外後のコード実行

__finally キーワードを使用すると、次のことが可能になります。例外が処理された後にコードを実行します。この機能は標準 C には存在しませんが、他の言語では一般的です。

デストラクター呼び出しの最適化を無効にする

Microsoft コンパイラーは、デストラクターを防止できる最適化を実行します。スタックの巻き戻し中にすべての場合に呼び出されないようにします。オブジェクトの有効期間を制御するスコープ内にスローが存在しないと判断した場合、登録コードをスキップします。デストラクターの呼び出しを確実に行うには、/EHa コンパイル オプションを使用してこの最適化を抑制します。

SEH および C 例外処理の例

概念を説明するために、コード スニペットを次に示します。これは、SEH 例外によって C デストラクター呼び出しがどのように許可されるか、および C 例外がその上にどのように構築されるかを示しています。 SEH:

#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;
}

出力:

Filtering c0000005
destructed
caught
Filtering e06d7363
destructed
caught

この例では、SEH 例外と C 例外の両方の処理を紹介し、SEH 例外中にもデストラクターがどのように呼び出されるかを示します。

以上がC で try/catch/finally の代わりに __try を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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