我的程序正在抛出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 ...
}
答案 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