C++基于Windows API开发命令行游戏引擎报“操作已成功”错误问题
问题成因
- 你触发的是自定义业务逻辑错误,而非Windows API调用失败:
CheckConsoleSize内的尺寸超限判断是自行实现的校验规则,触发该错误时没有任何Windows API调用失败,因此系统GetLastError()返回值仍为上一次成功调用API后的默认值0,对应系统提示就是「操作已成功」。 GetLastError()仅在Windows API明确返回失败状态(如返回INVALID_HANDLE_VALUE、返回FALSE等)时才有参考意义,正常执行的API不会重置该值,因此业务错误场景下读取到的系统错误信息是无效的。
解决方案
核心是区分「系统API调用错误」和「自定义业务逻辑错误」,不要在业务错误场景下读取系统错误码:
- 修改Error函数,增加是否输出系统错误的控制参数
void Error(const HANDLE& hConsole, const wchar_t* msg, bool isSysError = true) { SetConsoleActiveScreenBuffer(hConsole); wprintf(L"ERROR: %s\n", msg); // 仅系统错误场景读取系统错误信息 if (isSysError) { wchar_t buf[256]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL); wprintf(L"\t%s\n", buf); } exit(-1); }
- 业务错误触发时关闭系统错误输出
在CheckConsoleSize中调用Error时,指定不需要输出系统错误:
if (screenWidth > largestSize.X) Error(hConsole, L"The width dimension is too large.", false); if (screenHeight > largestSize.Y) Error(hConsole, L"The height dimension is too large.", false);
原有API调用失败的场景(如CreateConsoleScreenBuffer返回无效句柄、SetConsoleScreenBufferSize调用失败等)无需修改参数,仍按原有逻辑输出系统错误信息即可。
内容的提问来源于stack exchange,提问作者AngelosFr
相关产品推荐
相关产品推荐

