我遇到以下简单代码的问题:
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
。
我的问题是:我怎样才能更好地调试这种情况?为什么它只在本地发生而另一个环境问题没有出现?我怎样才能防止这些奇怪的行为呢?
感谢您的帮助!
答案 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信息冲突的结果。这是我唯一可以想到的解释测试用例行为的方法。