捕获boost :: ptime流上的错误

时间:2017-11-09 04:23:12

标签: c++ boost

我有一个返回格式化日期/时间字符串的函数。实际的日期和时间是不变的;它是我追求的结果字符串的格式。

std::string example_datetime(const std::string &boostspec)
{
    std::ostringstream os;
    os.imbue(std::locale(std::locale::classic(), new boost::posix_time::time_facet(boostspec.c_str())));
    os << boost::posix_time::time_from_string("2014-02-13 08:30:00.000");
    return os.fail() ? "invalid specifier" : os.str();
};

我将使用这样的函数:

std::string str(example_datetime("%a %b %d, %Y, %H:%M:%S"));

当我传递无效的boostspec字符串时,我遇到了问题。函数中的3 rd 行在进入os.fail()检查之前崩溃。我已经尝试捕捉到我能想到的所有异常,但似乎无法找到任何有用的东西。检查boostspec说明符字符串的有效性是此函数的关键目的。

编辑:我正在使用boost 1.63和VS2012。 当boostspec =“%a%”时,它可靠地崩溃了 - 注意空格

1 个答案:

答案 0 :(得分:1)

<强>更新

看起来MSVC的标准库实现中存在一个错误。默认情况下,Boost会将一些工作委托给std::time_put<>

<强> Live On http://rextester.com/TMXPG58348

#include <ctime>
#include <iomanip>
#include <iostream>

int main() {
    try {
    // std::locale::global(std::locale("de_DE.utf8"));
    std::time_t t = std::time(NULL);
    std::tm tm = *std::localtime(&t);

    std::string const fmt = "%a % ";
    std::use_facet<std::time_put<char> >(std::cout.getloc())
        .put({ std::cout }, std::cout, ' ', &tm, fmt.data(), fmt.data() + fmt.size());
    } catch(...) {
        std::cerr << "An exception was raised\n";
    }
}

结果是

enter image description here

你的问题可能存在于其他地方:

<强> Live On Coliru

#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

std::string example_datetime(const std::string &boostspec)
{
    std::ostringstream os;
    os.imbue(std::locale(std::locale::classic(), new boost::posix_time::time_facet(boostspec.c_str())));
    os << boost::posix_time::time_from_string("2014-02-13 08:30:00.000");
    return os.fail() ? "invalid specifier" : os.str();
}

int main() {
    std::cout << example_datetime("%a % %") << std::endl;
    std::cout << example_datetime("“%a % %”") << std::endl;
}

打印

Thu % 
“Thu % %”

很好。