增强共享库中的异常

时间:2012-01-06 19:34:35

标签: c++ gcc boost exception-handling

编辑:已解决。问题更加温和 - 我有两个函数在一行代码中相互调用 - 都使用了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; } Tlongs等于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;
}

有关正在发生的事情的任何想法,更重要的是如何解决这个问题?

2 个答案:

答案 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在某处被定义,那将会发生。