gpt4 book ai didi

c++ - 奇怪 - mysql 的 sql::SQLException 未被其类型捕获,而是被捕获为 std::exception 并成功投回

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:36 25 4
gpt4 key购买 nike

我正在将 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 block 中被捕获,但可以成功转换为(并用作)sql::SQLException

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

RHEL 5.7 32 位,gcc 4.1.2

最佳答案

请参阅 dynamic_cast, throw, typeid don't work with shared libraries 的注释在 GCC 常见问题页面上。

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

关于c++ - 奇怪 - mysql 的 sql::SQLException 未被其类型捕获,而是被捕获为 std::exception 并成功投回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com