【问题标题】:boost exceptions in a shared library提升共享库中的异常
【发布时间】: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 子句没有捕获它)。 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;
}

关于发生了什么以及更重要的是如何解决此问题的任何想法?

【问题讨论】:

  • 为什么不抓住 boost::bad_lexical_cast& 或 std::exception& 呢?它没有回答你的问题,但也许它会帮助编译器。

标签: c++ gcc boost exception-handling


【解决方案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]

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

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

【讨论】:

  • 据我了解,这只是共享库的问题。当我不使用任何库时,我可以捕获异常,但是一旦我将代码放入库中,它就会停止工作。有一些关于共享库 herehere 中的异常的讨论,但这些东西对我没有帮助。
  • 为了完整性 - 我的实际代码结构稍微复杂一些 - 例外情况是在我正在使用的另一个库使用的库中。
【解决方案2】:

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

【讨论】:

  • 不是。也许我有点不清楚 - boost::bad_lexical_cast 异常被抛出并且程序终止,但该异常没有被 catch 块捕获。
  • 这很奇怪。我看到你的 catch 子句重新抛出它。您是否在那里设置了断点,还是指望std::cout 来查看是否捕获了异常?
  • 我尝试设置断点 - 它永远不会到达那里。事实上,当它死后,我什至无法获得正常的回溯——它只显示libgcc smth,然后只显示几帧???'s
猜你喜欢
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2015-11-18
  • 2010-11-06
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多