编辑:已解决。问题更加温和 - 我有两个函数在一行代码中相互调用 - 都使用了lexical_cast
而其他正在崩溃。有趣的是,我只能通过喷洒很多cout
来找到它,因为崩溃时没有回溯,当调试行是行时,gdb无论出于何种原因显示错误{{1}作为罪魁祸首(我没有看到另一个,叹息)。谢谢你的帮助!
我正在使用gcc 4.1.2并提升1.48。我在模板函数内的共享库中有以下代码:
lexical_cast
转换失败,但异常没有被捕获( 传播并终止程序,但是这个catch子句没有捕获它)。 try {
boost::lexical_cast<T>(s);
}
catch (...) {
std::cout << "Caught it" << std::endl;
throw;
}
为T
,long
为s
等于std::string
。 (我也尝试在"234a234"
中包含boost包括,并在链接时尝试添加#pragma GCC visibility push(default)
标志,但没有做任何事情。)
虽然变得更好。在以下两种情况下,异常会被捕获:
-shared-libgcc
令人惊讶的是这个:
try {
throw boost::bad_lexical_cast();
}
catch (...) {
std::cout << "Caught it" << std::endl;
throw;
}
有关正在发生的事情的任何想法,更重要的是如何解决这个问题?
答案 0 :(得分:1)
我无法在我的机器上重现,但我正在使用不同的编译器
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,那么catch-all就可以了。
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
答案 1 :(得分:0)
如果BOOST_NO_EXCEPTIONS
在某处被定义,那将会发生。