gpt4 book ai didi

c++ - 在共享库中增加异常

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

编辑:已解决。问题要温和得多 - 我有两个函数在一行代码中相互调用 - 都使用了 lexical_castother 一个崩溃了。有趣的是,我只能通过散布大量的 cout 来发现这一点,因为在崩溃时没有回溯,并且在调试线路时,gdb 出于某种原因显示错误的 lexical_cast 作为罪魁祸首(我没有看到另一个,叹息)。感谢您的帮助!


我使用的是 gcc 4.1.2 和 boost 1.48。我在模板函数内的共享库中有以下代码:

try {
boost::lexical_cast<T>(s);
}
catch (...) {
std::cout << "Caught it" << std::endl;
throw;
}

强制转换失败,但未捕获异常(它确实传播并终止程序,但此 catch 子句未捕获它)。 Tlongsstd::string 等于 "234a234"。 (我还尝试将 boost 包含在 #pragma GCC visibility push(default) 中并尝试在链接时添加 -shared-libgcc 标志,但没有做任何事情.)

但它变得更好了。在以下两种情况下,确实会捕获到异常:

try {
throw boost::bad_lexical_cast();
}
catch (...) {
std::cout << "Caught it" << std::endl;
throw;
}

令人惊讶的是这个:

try {
boost::lexical_cast<T>(s);
throw boost::bad_lexical_cast();
}
catch (...) {
std::cout << "Caught it" << std::endl;
throw;
}

关于发生了什么以及更重要的是如何解决这个问题有什么想法吗?

最佳答案

我无法在我的机器上重现,但我使用的是不同的编译器

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)

我用下面的作为测试:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include <string>
#include <exception>

using namespace std;

template<typename T>
T printLexicalCast(const std::string& s){
T t;
try {
t = boost::lexical_cast<T>(s);
cout << "cast is [" << t << "] from string [" << s << "]" << endl;
}
catch (const boost::bad_lexical_cast& e ) {
std::cout << "Caught bad lexical cast with error " << e.what() << std::endl;
}
catch( ... ){
std::cout << "Unknown exception caught!" << endl;
}
return t;
}


int main(int argc, char *argv[]) {

std::string badString("234a234");
long l1 = printLexicalCast<long>(badString); //exception


std::string goodString("123456");
long l2 = printLexicalCast<long>(goodString);

return 0;
}

我得到以下输出:

Caught bad lexical cast with error bad lexical cast: source type value could not be interpreted as target
cast is [123456] from string [123456]

如果我删除 bad_lexical_cast 捕获所有的工作。

Unknown exception caught!
cast is [123456] from string [123456]

也许这只是一个编译器错误?我在 boost-users 列表中找到了这个

http://boost.2283326.n4.nabble.com/conversion-lexical-cast-doesn-t-throw-td2593967.html

关于c++ - 在共享库中增加异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8763425/

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