2

関数 try ブロックは、関数本体の特別な形式です。たとえば、次のようになります。

int f() try {
  // function body
} 
catch {
  // one or more catch-clauses.
}

主な目的は、基本クラスのコンストラクターによってスローされた例外をログに記録するために、コンストラクターで使用することです。ただし、通常の関数でも使用できます。

これにはいくつかの (かなり古い) 質問があり、通常の関数 (たとえばFunction try ブロックなど) ではなぜそれが必要なのか、コンストラクターでは必要ないのかという質問があります。ただし、私の質問は少し別の方向にあります。通常の try ブロックの代わりに通常の関数で問題なく使用できますか? たとえば、審美的な理由だけでしょうか。

私は C++ ライブラリ用の C インターフェイスを開発しており、例外をキャッチするために各インターフェイス関数を try ブロックでカプセル化する必要があります。したがって、各関数に追加の中括弧ブロックを避けたいと思います...

私の懸念を引き起こした 1 つのこと: https://stackoverflow.com/a/11535436/6695750の回答で、davka は 2000 年の記事を引用しています。関数試行ブロック。gcc 5.4.0 でテストしたところ、catch ブロックから問題なく値を返すことができました。これは標準ですか、それとも gcc の非標準拡張ですか?

4

2 に答える 2

2

通常の try ブロックの代わりに通常の関数で問題なく使用できますか?

場合によっては、使用できません。句function-try-block内のローカル変数にアクセスできません。catch

void g() {
    int i = 2;
    try {
        throw 2.3;
    } catch (double d) {
        cout << i << endl;   // OK. you can access i
        cout << d << endl;
    }
}

void f() try {
    int i = 2;
    throw 2.3;
} catch (double d) {
    cout << i << endl;   // FAIL! i is out of scope, you CANNOT access it.
    cout << d << endl;
}
于 2016-08-24T08:40:54.743 に答える