【发布时间】:2012-01-06 19:34:35
【问题描述】:
编辑:已解决。问题要温和得多——我有两个函数在一行代码中相互调用——都使用了lexical_cast,而other一个崩溃了。有趣的是,我只能通过添加大量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 子句没有捕获它)。 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;
}
令人惊讶的是这个:
try {
boost::lexical_cast<T>(s);
throw boost::bad_lexical_cast();
}
catch (...) {
std::cout << "Caught it" << std::endl;
throw;
}
关于发生了什么以及更重要的是如何解决此问题的任何想法?
【问题讨论】:
-
为什么不抓住 boost::bad_lexical_cast& 或 std::exception& 呢?它没有回答你的问题,但也许它会帮助编译器。
标签: c++ gcc boost exception-handling