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().

抛出的异常在第二个catch块中被捕获,但可以成功转换为(并用作)sql::SQLException

更奇怪的是,不同可执行文件中的类似代码sql::SQLException按预期捕获。它们之间的区别在于,第一个位于加载了 .so 的共享对象 (.so) 中dlopen()

RHEL 5.7 32 位,gcc 4.1.2

4

1 回答 1

4

请参阅GCC 常见问题页面上的dynamic_cast, throw, typeiddon't work with shared library的注释。

因为您正在使用dlopen(),所以您需要将可执行文件与-E标志链接(或传递
-Wl,-Eg++ifg++正在调用链接器)并将RTLD_GLOBAL标志传递给dlopen().

于 2012-09-12T12:47:29.257 回答