この (少し単純化された) コードで 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