捕获琐碎的提升异常的奇怪问题

Weird issue with catching trivial boost exception

本文关键字:异常 问题      更新时间:2023-10-16

我对以下简单的代码有问题:

    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 <<"'";
    }

lexical_cast引发的boost::bad_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> >

而另一个仅为CCD_ 4。

我的问题是:如何更好地调试这种情况?为什么它只在本地发生,而在另一个环境中却没有出现问题?我该如何防止这些奇怪的行为?

谢谢你的帮助!

您看到的奇怪类型是boost::exception_detail::clone_impl< boost::exception_detail::error_info_injector< boost::bad_lexical_cast>>。它是Boost.Exception提供的bad_lexical_cast的包装器(并从中派生),它提供了对boost::exception_ptr和错误信息工具的支持。第一次接球时应该能很好地接住。

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