2012-01-06 30 views
2

编辑:已解决。问题更加温和 - 我有两个函数在一行代码中互相调用 - 使用lexical_cast其他一个崩溃。有趣的是,我只能通过喷洒很多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; 
} 

转换失败,但异常不会被逮住(它确实繁殖和终止程序,但这种赶超条款没有按赶不上)。 Tlongsstd::string等于"234a234"。 (我也试过包装在#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; 
} 

上发生了什么事情,更重要的任何想法如何解决这一问题?

+0

为什么抓不住的boost :: bad_lexical_cast&或std ::例外&呢?它不回答你的问题,但也许它会帮助编译器。 – Joel 2012-01-06 19:44:44

+0

试过 - 没有帮助:( – eddi 2012-01-06 19:48:47

回答

0

如果BOOST_NO_EXCEPTIONS被定义在某处,会发生这种情况。

+0

不是这样,也许我有点不清楚 - 抛出boost :: bad_lexical_cast异常并且程序终止,但是这个异常不会被捕获块捕获 – eddi 2012-01-06 19:58:51

+0

这是奇怪的。我看到你的catch子句重新抛出它,你有没有在那里设置断点,或者你是否依靠'std :: cout'来查看你是否发现了这个异常? – 2012-01-06 20:58:55

+0

我试着设置一个断点 - 它永远不会到达那里。事实上,当它死了,我甚至不能得到一个正常的回溯 - 它只是显示'libgcc' smth,然后只是几帧''' – eddi 2012-01-06 21:02:35

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捕捉所有的作品。

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

也许这只是一个编译器错误?我发现这对提升用户列出

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

+0

据我了解这是一个共享库唯一的问题。 当我不使用任何库时,我可以捕获异常,但是一旦我将代码放入库中,它就会停止工作。有关共享库中的例外的一些讨论[这里](http://gcc.gnu.org/wiki/Visibility)和[here](http://lists.boost.org/boost-users/2008/09/ 40268.php),但那些东西没有帮助我。 – eddi 2012-01-06 20:59:53

+0

为了完整性 - 我的实际代码结构稍微复杂一些 - 例外情况出现在我正在使用的另一个库使用的库中。 – eddi 2012-01-06 21:07:47