抓住琐碎的提升异常的奇怪问题

时间:2015-02-19 10:25:07

标签: c++ boost exception-handling

我遇到以下简单代码的问题:

    try
    {
        boost::lexical_cast<unsigned int>("invalid string");
    }
    catch(::boost::bad_lexical_cast &)
    {
        //It's not catched!!!
        return;
    }
    catch (std::exception &e){
        std::cerr << boost::diagnostic_information(e) << std::endl;

        ::boost::bad_lexical_cast s;
        std::string ss = typeid(s).name();
        std::cout << "'" << s.what()<<"': '"<< ss <<"'";

        std::string ee = typeid(e).name();
        std::cout << "'" << e.what()<<"': '"<< ee <<"'";
    }

boost::bad_lexical_cast引发的lexical_cast异常与我尝试捕获的异常不同,因此第一个捕获被忽略。 一个例外是类型:

(错位) N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_16bad_lexical_castEEEEE

是:

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> >

而另一个只是boost::bad_lexical_exception

我的问题是:我怎样才能更好地调试这种情况?为什么它只在本地发生而另一个环境问题没有出现?我怎样才能防止这些奇怪的行为呢?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您看到的奇怪类型是boost::exception_detail::clone_impl< boost::exception_detail::error_info_injector< boost::bad_lexical_cast>>。它是Boost.Exception提供的bad_lexical_cast的包装器(并且派生自它),它提供对boost::exception_ptr和错误信息工具的支持。第一次捕获它应该被捕获。

如果不是,那通常是不同动态库中RTTI信息冲突的结果。这是我唯一可以想到的解释测试用例行为的方法。