我正在尝试在我们的项目中使用如下的posix_time_zone。
time_zone_ptr zone(new posix_time_zone(localTimeZone.c_str()));
const string hasDST = zone->has_dst() ? "true" : "false";
const int Year = second_clock::local_time().date().year();
const string stTime = to_iso_extended_string(zone->dst_local_start_time(Year));
const string endTime = to_iso_extended_string(zone->dst_local_end_time(Year));
localTimeZone将由项目中的另一个应用程序设置。我需要使用该值通过posix_time_zone获取dst相关参数。我无法控制另一个应用程序设置的值,我遇到了以下崩溃。
(gdb) bt
#0 0xb5a7f8a6 in ?? () from /lib/libc.so.6
#1 0xb5a8dcde in raise () from /lib/libc.so.6
#2 0xb5a905b6 in abort () from /lib/libc.so.6
#3 0xb5c3e1e6 in __gnu_cxx::__verbose_terminate_handler () at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/vterminate.cc:95
#4 0xb5c3ce60 in __cxxabiv1::__terminate (handler=<optimized out>) at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/eh_terminate.cc:38
#5 0xb5c3ce7c in std::terminate () at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/eh_terminate.cc:48
#6 0xb5c3d068 in __cxxabiv1::__cxa_throw (obj=0xb4f00a90, tinfo=0xb60a7e34 <typeinfo for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> >>,
dest=0xb60665e1 <boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> >::~clone_impl()>) at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/eh_throw.cc:87
#7 0xb6062dc0 in void boost::throw_exception<boost::bad_lexical_cast>(boost::bad_lexical_cast const&) () from /usr/local/lib/libmbtime.so
#8 0xb60631aa in boost::detail::lexical_cast_do_cast<int, std::string>::lexical_cast_impl(std::string const&) () from /usr/local/lib/libmbtime.so
#9 0xb605f3ea in int boost::lexical_cast<int, std::string>(std::string const&) () from /usr/local/lib/libmbtime.so
#10 0xb605b686 in boost::posix_time::time_duration boost::date_time::str_from_delimited_time_duration<boost::posix_time::time_duration, char>(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
来自/usr/local/lib/libmbtime.so的来自/usr/local/lib/libmbtime.so的boost :: local_time :: posix_time_zone_base :: calc_zone(std :: string const&amp;)()中的#11 0xb605c80e 来自/usr/local/lib/libmbtime.so的boost :: local_time :: posix_time_zone_base :: posix_time_zone_base(std :: string const&amp;)()中的#12 0xb6059440 来自/usr/local/lib/libmbtime.so的PlatformTime :: TimeZoneHandler(void *)()中的#13 0xb6054e1e #14 0xb6f7d170在? ()来自/lib/libpthread.so.0 Backtrace已停止:前一帧与此帧相同(损坏的堆栈?) (gdb)退出
这可能是因为localTimeZone有一些无效值(另一个问题是我使用的是c字符串,我需要更改C ++字符串)。任何人都可以给出任何建议如何测试localTimeZone是否具有正确的格式提升期望。
答案 0 :(得分:2)
如果传递的值无效,则boost::local_time::posix_time_zone
的构造函数会抛出std::invalid_argument
,std::out_of_range
或boost::bad_lexical_cast
(本例中为一个)。抓住这些例外(或抓住他们共同的父母std::exception
),它不会崩溃。