1

この (少し単純化された) コードで mysql c++ コネクタを使用しています。

try
{
    statement->setString(1, word);
    statement->executeUpdate();
}
catch( sql::SQLException& e )
{
    // I don't get here
    return sqlerrno_to_error_code( e.getErrorCode() );
}
catch( std::exception& e )
{
    // I do get here and the cast works
    sql::SQLException& sqle = (sql::SQLException&) e;
    return sqlerrno_to_error_code( sqle.getErrorCode() );
}

コネクタは、std::exception から派生した sql::SQLException をスローすることになっており、getErrorCode().

スローされた例外は 2 番目のcatchブロックでキャッチされますが、正常にキャスト (および使用) できますsql::SQLException

さらに奇妙なのは、別の実行可能ファイルの同様のコードがsql::SQLException期待どおりにキャッチされることです。それらの違いは、最初のものは .so で読み込まれる共有オブジェクト (.so) にあることですdlopen()

RHEL 5.7 32 ビット、gcc 4.1.2

4

1 に答える 1

4

GCCのよくある質問のページにある共有ライブラリを使用ないdynamic_castthrowtypeidくださいの注を参照してください。

を使用しているためdlopen()、実行可能ファイルを-Eフラグにリンクし(または、リンカーを呼び出している場合はに渡す)、
-Wl,-Eフラグg++をに渡す必要があります。g++RTLD_GLOBALdlopen()

于 2012-09-12T12:47:29.257 に答える