c-很奇怪-mysql的sql :: SQLException未被其类型捕获,而是被捕获为std :: exception并成功地回退
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c-很奇怪-mysql的sql :: SQLException未被其类型捕获,而是被捕获为std :: exception并成功地回退,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含964字,纯文字阅读大概需要2分钟。
内容图文
![c-很奇怪-mysql的sql :: SQLException未被其类型捕获,而是被捕获为std :: exception并成功地回退](/upload/InfoBanner/zyjiaocheng/888/3a17cfd20e824fb5b2164a1f48c256fd.jpg)
我正在使用带有此(稍微简化)代码的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() );
}
连接器应该抛出sql :: SQLException,它是从std :: exception派生的,并具有一些其他方法,如getErrorCode().
引发的异常在第二个catch块中捕获,但是可以成功地强制转换为sql :: SQLException(并用作).
更奇怪的是,不同可执行文件中的类似代码按预期捕获了sql :: SQLException.它们之间的区别在于,第一个位于共享库(.so)中,该共享库已加载dlopen().
RHEL 5.7 32位,gcc 4.1.2
解决方法:
请参阅“ GCC常见问题”页面上有关dynamic_cast, throw, typeid don’t work with shared libraries的注释.
因为使用的是dlopen(),所以需要将可执行文件与-E标志链接(如果g正在调用链接程序,则将-Wl,-E传递至g),并将RTLD_GLOBAL标志传递给dlopen().
内容总结
以上是互联网集市为您收集整理的c-很奇怪-mysql的sql :: SQLException未被其类型捕获,而是被捕获为std :: exception并成功地回退全部内容,希望文章能够帮你解决c-很奇怪-mysql的sql :: SQLException未被其类型捕获,而是被捕获为std :: exception并成功地回退所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。