本体なしで、try / catchブロックのみの関数/メソッドを実際に使用できますか?

StackOverflow https://stackoverflow.com/questions/335839

  •  22-07-2019
  •  | 
  •  

質問

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

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

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

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

http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

役に立ちましたか?

解決

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

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

他のヒント

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

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

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};

Herb Sutterにはこれに関する良い記事があります: http://www.gotw.ca/gotw /066.htm

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top