如何从std :: regex_error中获取解释性字符串?

时间:2015-10-08 22:55:17

标签: c++ regex c++11 error-handling

我的程序正在抛出std::regex_error()。我想知道错误是什么,因为正则表达式对我来说是合法的。我基本上做了这个:

try {
    // offending code
} catch (std::regex_error& e) {
    log_error("Regex error: " << e.what() << ", " << e.code());
}

输出结果为:

Regex error: regex_error, 4

这不是特别有用。 4是什么意思? en.cppreference.com entry for code()只说:

  

返回传递给std :: regex_error构造函数的std :: regex_constants :: error_type。

error_type的条目提供了错误代码列表,所有错误代码都是“未指定”。

我没有办法,只能这样做吗?

switch (e.code()) {
    case std::regex_constants::error_collate: return "error_collate";
    case std::regex_constants::error_ctype: return "error_ctype";
    // etc ...
}

2 个答案:

答案 0 :(得分:8)

这是标准C ++库中的一个实施质量问题,这是一个很好的说法,它是一个错误。确切地说GCC bug 67361(&#34; std :: regex_error :: what()应该说一下error_code&#34;)。

错误报告中最近提交了一个补丁,所以我认为它最终会显示为升级。 [更新:根据上面的错误报告,它已在v6.1(2016年4月26日发布)中修复,但错误报告在2018年11月19日之前未标记为已解决。无论如何,如果你有一个合理的近期分布,这不应该是一个问题。]

与此同时,你几乎没有选择,只能推出自己的代码 - &gt;消息转换功能。 (或者,作为临时调试方法,请咨询include/bits/regex_error.h

答案 1 :(得分:0)

使用switch的另一种方法是为每个正则表达式错误代码定义自己的枚举,并将结果转换为该枚举,为您提供更好的运行时调试帮助。

enum class RegexError {
    collate = std::regex_constants::error_collate,
    ctype   = std::regex_constants::error_ctype,
    // etc
};

RegexError errorCode = static_cast<RegexError>( e.code() );
// your debugger will now show you what the meaning of errorCode is

这样你就不需要使用字符串了。

但是,如果您想以人类可读的方式向用户显示错误,那么您将需要使用字符串,但您可以使用地图来存储它们:

map<RegexError, wchar_t const * const> errorMessages;
errorMessages[RegexError::collate] = L"the expression contains an invalid collating element name";
errorMessages[RegexError::ctype  ] = L"the expression contains an invalid character class name";
// etc