15

この関数には "{" と "}" の本体がないことに注意してください。ただの try/catch ブロック:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

これは意図的に C++ の一部ですか、それとも g++ 拡張機能ですか?

これには、{} の 1 レベルをバイパスする以外に何か目的はありますか?

http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.htmlに出くわすまで、これについて聞いたことはありませんでした。

4

2 に答える 2

11

はい、有効な C++ です。私が見つけた目的の 1 つは、例外を戻り値に変換し、戻り値の例外を変換するコードを関数内の他のコードとは別にすることです。はい、あなたがreturn x;示したようなキャッチブロックからできます(実際、最近発見したばかりです)。しかし、その場合は、おそらく別のレベルの中括弧を使用して、try/catch を関数内に配置するだけです。ほとんどの C++ プログラマにとっては、よりなじみ深いものです。

もう 1 つの目的は、同様の構文を使用するコンストラクター初期化子リストによってスローされた例外をキャッチすることです。

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};
于 2008-12-02T23:53:56.257 に答える
9

はい、標準です。関数の try ブロックは、呼び出されるので、通常の関数にはあまり使用されませんが、コンストラクターの場合は、初期化リストでスローされた例外をキャッチできます。

コンストラクターの場合、例外は常に catch ブロックの最後で再スローされることに注意してください。

于 2008-12-02T23:50:10.853 に答える