Win32 API 失败

3

需要检查所有Win32 API的返回值吗?例如,像AdjustWindowRectSetWindowLongGetWindowLong等函数真的可能会失败(有内部错误),或者返回值大多是防止输入错误参数的故障保护机制吗?


每个API的故障模式和检查方式都在MSDN中有记录。您应该处理您能够处理的,对于任何其他情况则应该失败/提醒。绝不要默默地丢弃意外的结果。 - Deanna
@Deanna:但是MSDN中很少记录故障条件和分类。在什么情况下SetWindowLong会导致ERROR_FILE_EXISTS(这应该是“从不”)也没有记录。 - user824425
@Tinctorius 这属于“意外结果”,应该放弃,因为出现了你无法处理的错误。但是你可以处理预期的错误。 - Deanna
@Deanna:MSDN上的文档并没有给出一个“可以预期”的错误列表,因此它是不完整的。仅仅猜测可能会导致哪些错误是远远不够的。 - user824425
@Tinctorius:你没有理解重点。你不应该处理它所能处理的所有事情。你应该处理你预期并且可以处理的少数错误(例如,此文件只读,磁盘空间不足等)。MSDN告诉你如何报告错误,所以只需寻找你预期的那些错误即可。其他所有错误都应该是致命的和无法处理的。处理所有可能的错误代码是毫无意义的,因为其中至少有数十亿个错误代码会是“出了点问题”。 - Deanna
@Deanna:确实没有必要处理所有数十亿个可能的错误代码,因为只有少数几个是由所提到的API引发的——除非是非常特殊的情况。对于那些非常特殊的情况,你可以不处理它们。但是那些预期会出现的少数错误,这些错误必须被记录下来。它们没有被记录下来,因此MSDN是Win32 API非常糟糕的文档。 - user824425
1个回答

2
与 POSIX 不同的是,Win32 API 似乎没有为每个调用提供一个良好的错误条件列表。尽管某些函数在实践中不会失败(除非出现错误参数),但它们在理论上确实可能会失败。就像您不应该信任用户输入一样,您也不应该盲目信任文档不完整的库。
我认为处理 API 的最佳方式是将所有调用包装在函数中进行错误检查(这在 API 内部和之间差异很大),以便您拥有一种“更高级别”的 API,在其中所有特殊情况都被解决了。然后,您可以将成功、错误和警告转换为适合您语言的任何技术(例如异常、错误/警告回调、总和类型)。

1
我不知道你的意思。当一个函数返回错误(通常在WIN32中是0),你需要调用GetLastError()(而不是在Linux上查找errno),并将其与此处的列表进行比较:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx - Mahmoud Al-Qudsi
我的第一句话的意思是,某些调用只能导致某些错误代码。例如,ReadFile 导致 ERROR_WRITE_PROTECTERROR_FILE_EXISTS 毫无意义。对于每个函数,可能出现的错误集非常小,但确切的集合很少在 Win32 API 中记录。然而,在 POSIX 中,所有错误代码都被列出并解释了,不仅因为它们在特定调用的上下文中具有更具体的含义,而且因为例如 ENOENT 错误如果由 freadfgetc 返回则毫无意义。 - user824425

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接