我正在使用带有这个(有点简化)代码的 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()
.
抛出的异常在第二个catch
块中被捕获,但可以成功转换为(并用作)sql::SQLException
。
更奇怪的是,不同可执行文件中的类似代码sql::SQLException
按预期捕获。它们之间的区别在于,第一个位于加载了 .so 的共享对象 (.so) 中dlopen()
。
RHEL 5.7 32 位,gcc 4.1.2