以下是应用程序的简单示例
#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
try
{
auto date = boost::posix_time::microsec_clock::local_time();
// boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%d-%b-%Y %H:%M:%S"); --> this format works
boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%d-%b-%Y %k:%M:%s"); // --> this format causes an exception that can't be handled
std::stringstream ss;
ss.imbue(std::locale(ss.getloc(), facet));
//ss.exceptions(std::ios::badbit | std::ios::failbit);
ss << date; // --> exception occurs here - It can't be caught.
std::cout << ss.str() << std::endl;
}
catch (const std::exception& ex)
{
std::cerr << "std::exception " << ex.what() << std::endl;
}
catch (const boost::exception&)
{
std::cerr << "boost::exception " << std::endl;
}
catch (...)
{
std::cerr << "unknown exception" << std::endl;
}
return 0;
}
问题在于传递给facet的某种格式 - %k或%l会导致问题。使用此格式格式化日期时会出现异常。异常处理程序没有捕获异常 - 程序退出!
我正在创建一个库函数,所以我需要假设无效的格式字符串会发生。我没有异常 - 我只需要能够处理它并报告错误,或者在使用之前确认构面是否有效。
这在Windows 10上发生。错误在wcsftime函数中。另外wcsftime是一个宽字符函数,我使用8位字符。该应用程序在Visual Studio 2017中使用MultiByte字符集而不是Unicode进行编译。
问题发生在具有上述断言的调试器中。从命令行运行发布版本会导致应用程序崩溃并弹出“应用程序已停止工作”状态。 Windows对话框。
升级版本为1.65.1
我做错了什么?
答案 0 :(得分:0)
你做错的一件事就是使用MBCS ......绝对不推荐。的Windows&#39;本机字符串格式是UNICODE,所有以A结尾的函数都会转换输入字符串,然后调用它们的W对应字符串。
为什么打电话给新人?对于时间格式,堆栈上肯定有足够的空间。
无论如何,您看到的对话框显示断言失败消息。它是一个调试断点(__asm int 3;
),不是例外。它也只出现在运行时库的调试版本中。
您应该尝试编译发布版本,或者点击“忽略”#39;按钮并观看您的应用程序捕获异常。
[编辑]调查后,strftime()导致应用程序崩溃。 C运行时库将无效格式字符串视为致命错误。去了解原因,但这就是它的方式。