boost time_facet导致无法捕获的异常

时间:2017-12-05 22:08:50

标签: c++ boost

以下是应用程序的简单示例

#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进行编译。

Error from debugger

问题发生在具有上述断言的调试器中。从命令行运行发布版本会导致应用程序崩溃并弹出“应用程序已停止工作”状态。 Windows对话框。

升级版本为1.65.1

我做错了什么?

1 个答案:

答案 0 :(得分:0)

你做错的一件事就是使用MBCS ......绝对不推荐。的Windows&#39;本机字符串格式是UNICODE,所有以A结尾的函数都会转换输入字符串,然后调用它们的W对应字符串。

为什么打电话给新人?对于时间格式,堆栈上肯定有足够的空间。

无论如何,您看到的对话框显示断言失败消息。它是一个调试断点(__asm int 3;),不是例外。它也只出现在运行时库的调试版本中。

您应该尝试编译发布版本,或者点击“忽略”#39;按钮并观看您的应用程序捕获异常。

[编辑]调查后,strftime()导致应用程序崩溃。 C运行时库将无效格式字符串视为致命错误。去了解原因,但这就是它的方式。