怪异-mysql';sql::SQLException不是由其类型捕获的,而是作为std::exception捕获并成功回滚 我使用MySQL C++连接器(这个代码有点简化)。

怪异-mysql';sql::SQLException不是由其类型捕获的,而是作为std::exception捕获并成功回滚 我使用MySQL C++连接器(这个代码有点简化)。,c++,mysql,linux,exception,shared-libraries,C++,Mysql,Linux,Exception,Shared Libraries,连接器应该抛出sql::SQLException,它派生自std::exception,并具有一些附加方法,如getErrorCode() 抛出的异常在第二个catch块中被捕获,但可以成功地转换为(并用作)sql::SQLException 更奇怪的是,不同可执行文件中的类似代码捕获到了预期的sql::SQLException。它们之间的区别在于,第一个是在加载了dlopen()的共享对象(.so)中 RHEL 5.7 32位,gcc 4.1.2参见gcc常见问题页面上的注释 由于您使用的是d

连接器应该抛出sql::SQLException,它派生自std::exception,并具有一些附加方法,如
getErrorCode()

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

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

RHEL 5.7 32位,gcc 4.1.2

参见gcc常见问题页面上的注释

由于您使用的是
dlopen()
,因此需要将可执行文件与
-E
标志链接(或将
-Wl,-E
传递到
g++
,如果
g++
正在调用链接器),并将
rtldu GLOBAL
标志传递到
dlopen()
,请参见GCC常见问题页面上的注释


因为您使用的是
dlopen()
,所以需要将可执行文件与
-E
标志链接(或者将
-Wl,-E
传递到
g++
,如果
g++
正在调用链接器),并将
RTLD\u GLOBAL
标志传递到
dlopen()
,谢谢,同时发现了它,但目前为止似乎没有帮助。它是否取决于编译器版本?我的是4.1。2@davka:问题可能是使用了不同的编译器来编译MySQL Connector/C++库,因为编译器ABI是特定于实现的。尝试使用相同的编译器从源代码重新编译Connector/C++库(转到并从“平台”组合框中选择“源代码”)。我不认为我们可以重新编译连接器——我们请求客户端将mysqll作为pre-req安装,但值得检查它是哪个版本compiled@davka:您确定不能重新编译连接器/C++库并将自定义生成的库与可执行文件一起分发吗?我不相信Connector/C++是随MySQL一起安装的,而且在任何情况下,您都可以配置链接器链接到相对路径,依赖于
/lib/ld linux。因此
的$ORIGIN/rpath支持确保使用自定义的Connector/C++lib。您是正确的,它不是。这实际上是一个法律问题——即使客户是购买许可证的人,我们是否可以分发它。谢谢,同时找到了它,但到目前为止似乎没有帮助。它是否取决于编译器版本?我的是4.1。2@davka:问题可能是使用了不同的编译器来编译MySQL Connector/C++库,因为编译器ABI是特定于实现的。尝试使用相同的编译器从源代码重新编译Connector/C++库(转到并从“平台”组合框中选择“源代码”)。我不认为我们可以重新编译连接器——我们请求客户端将mysqll作为pre-req安装,但值得检查它是哪个版本compiled@davka:您确定不能重新编译连接器/C++库并将自定义生成的库与可执行文件一起分发吗?我不相信Connector/C++是随MySQL一起安装的,而且在任何情况下,您都可以配置链接器链接到相对路径,依赖于
/lib/ld linux。因此
的$ORIGIN/rpath支持确保使用自定义的Connector/C++lib。您是正确的,它不是。这实际上是一个法律问题——即使客户是购买许可证的人,我们是否可以分发它。
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() );
}