2

次のコードでは、dbhコンストラクターが例外をスローする可能性があります。私が持っている質問は、dbhがtryブロック内で宣言されているということです。キャッチ後に利用可能になりますか?はいの場合、スコープの解像度が{}と異なる他の例外はありますか?そうでない場合、最良の設計代替案は何ですか?

status func(const char* field, char** value)
{
    try {
        dbhandler<recType> dbh(("dbName"),("table"));
    }
    catch (std::runtime_error &e) {
        LOG_ERR << e.what() << endl ;
        return false;
    }
    catch (...) {
        LOG_ERR << "Unknown exception" << endl ;
        return false;
    }

    rc = dbh.start("key",field, val);
    return rc;
}
4

2 に答える 2

8

キャッチ後に利用可能になりますか?

いいえ。他のローカル変数と同様に、宣言されたブロックの最後で破棄されます。

try {
    dbhandler<recType> dbh(("dbName"),("table")); 
}   // dbh.~dbhandler<recType>() is called to destroy dbh

最良の設計代替案は何ですか?

dbhブロックの外側で宣言tryするか、それを使用するすべてのコードをブロックに移動しtryます。どちらが最も理にかなっているのかは、特定のユースケースによって異なります。

やや関連性のある注意点としてcatch (...)、例外を再スローするか、アプリケーションを終了する必要があります。どの例外が処理されているかわからず、一般に、実行を続行しても安全かどうかもわかりません。

于 2011-02-25T17:34:21.750 に答える
2

関数コードによると、次のように書くのは理にかなっています。

status func(const char* field, char** value)
{
    try {
        dbhandler<recType> dbh(("dbName"),("table"));
        status rc = dbh.start("key",field, val);
        return rc;
    }
    catch (std::runtime_error &e) {
        LOG_ERR << e.what() << endl ;
        return false;
    }
    catch (...) {
        LOG_ERR << "Unknown exception" << endl ;
        return false;
    }
}
于 2011-02-25T17:41:34.373 に答える