【发布时间】:2020-10-29 08:01:49
【问题描述】:
我在 VS2013 C++ 程序中使用::strftime()。有没有办法正确处理"invalid format" 错误,而不会有停止整个程序的风险?
当我以错误的格式运行如下函数的代码时,比如"%Y- %- m-%d",它是“游戏结束”。我明白了:
“调试断言失败...格式指令无效”
我只能停止应用程序(单元测试套件)。
有没有办法把它变成异常、errno 代码等,以便我可以正确处理这种情况?
或者,我应该使用其他功能吗?
或者,在调用strftime()之前,我必须手动检查格式字符串吗?
using namespace std;
string foo( string fmt ) // fmt: user supplied format - may be invalid
{
if (fmt.empty()) return "";
struct tm myTm = ...; // get it some how
size_t n = 0;
size_t buflen = 2 * fmt.size();
while (buflen < 100) {
vector<char> buf( buflen, '\0' );
try {
n = ::strftime( buf.data(), buf.size(), fmt.c_str(), &myTm );
if (n>0)
return string( buf.data(), buf.data() + n );
if ((n == 0) && (34 == errno)) {
// 34 == "Result too large" (at least in VS2013)
buflen *= 2; // try with larger buffer
continue;
}
// I NEVER REACH THIS POINT! :-(
throw runtime_error( "please check your format string!" );
}
catch (...) {
// I NEVER REACH THIS POINT! :-(
throw runtime_error( "please check your format string" );
}
}
throw runtime_error( "max buffer size reached" );
}
【问题讨论】:
-
strftime是 C 库中的一个函数,作为一个 C 函数,它对异常一无所知,也不能抛出异常。 -
顺便说一句,用户提供的格式通常是一个非常糟糕的主意。它会打开您的代码以进行可能的攻击。
-
我知道,这是一个 C 函数。所以我希望得到一个 errno 左右。但我没有。 :-(
-
不一定是例外。我想要的只是处理错误格式错误 - 但 VS2013 迫使我停止程序(也在发布模式下)。
-
您为什么要将用户提供的格式字符串传递给
strftime?您是否希望您的用户逐字输入?
标签: c++ error-handling visual-studio-2013 strftime