程序是否应检查"不应该"的WinAPI函数是否失败,但可能会失败?

rot*_*mod 8 c++ error-handling winapi

最近我使用GetWindowDC - > CreateCompatibleDC - > CreateCompatibleBitmap - > SelectObject - > BitBlt - > GetDIBits系列WinAPI函数更新了一些用于截屏的代码.现在我检查所有那些失败因为他们可以而且有时会失败.但是我必须通过删除创建的位图,删除创建的直流并释放窗口dc来执行清理.在我见过的任何例子中 - 即使在MSDN上 - 也没有检查相关函数(DeleteObject,DeleteDC <ReleaseDC)是否失败,大概是因为如果它们被检索/创建好,它们将永远被删除/释放OK.但是,他们仍然失败.

这只是一个值得注意的例子,因为呼叫完全相邻.但偶尔还有其他功能可能会失败,但在实践中永远不会.比如GetCursorPos.或者仅在传递无效数据时才会失败的函数,例如FileTimeToSytemTime.

那么,检查可能因失败而失败的所有功能是否良好?或者有些可以不检查?作为必然结果,当检查这些应该永不失败的失败函数时,什么是正确的?抛出运行时异常,使用断言,还有什么?

Guv*_*nte 5

是否测试的问题取决于失败时你会做什么.一旦清理完成,大多数样品都会退出,因此验证正确的清理是没有用的,程序在任何一种情况下都会退出.

不检查GetCursorPos可能导致错误的东西,但取决于避免这种情况所需的代码决定了你是否应该检查.如果检查它会在你的所有电话周围添加3行,那么你可能最好承担风险.但是,如果你有一个宏设置来处理它,那么添加该宏以防万一.

FileTimeToSystemTime被检查取决于你传递给它的是什么.来自系统的文件时间?可能安全地忽略它.从用户输入构建的自定义字符串?可能更好地确保.


Ira*_*ter 4

是的。你永远不知道什么时候承诺的服务会因为不起作用而令人惊讶。即使是意外,最好还是报告错误。否则,您会发现客户说您的应用程序无法运行,而原因将完全是个谜;您将无法以及时、有用的方式回复您的客户,而双方都会遭受损失。

如果您将代码组织为始终执行此类检查,那么将下一个检查添加到您调用的下一个 API 中并不困难。