【问题标题】:Win32 API failureWin32 API 失败
【发布时间】:2013-01-23 17:24:54
【问题描述】:

是否需要检查所有Win32 APIs 返回值?例如,AdjustWindowRectSetWindowLongGetWindowLong 等函数真的会失败(有内部错误),或者返回值主要是不输入错误参数的故障安全机制?

【问题讨论】:

  • 每个 API 的故障模式以及如何检查都记录在 MSDN 中。你应该处理你能做的事情并失败/提高任何其他人。永远不要默默地放弃意想不到的结果。
  • @Deanna:但 MSDN 中很少记录故障情况和分类。没有记录在哪些情况下SetWindowLong 会导致ERROR_FILE_EXISTS(应该是“从不”)。
  • @Tinctorius 这属于“意外结果”,应该是放弃的理由,因为出现了您无法处理的问题。但是,您可以处理您期望的错误。
  • @Deanna:MSDN 上的文档没有为您提供预期的错误列表。因此,它是不完整的。仅仅猜测可能导致哪些错误是不够的。
  • @Tinctorius:你没有抓住重点。你不应该处理它可以通过的所有事情。您应该处理一些您期望的错误并且可以做一些事情(这个文件是只读的,磁盘空间不足等)MSDN 告诉您它如何报告它的错误,所以只需寻找您期望的错误。其他一切都应该是致命的和无法处理的。处理所有数十亿可能的错误代码是没有意义的,因为其中至少有数十亿是“出了问题”。

标签: winapi


【解决方案1】:

与 POSIX 不同,Win32 API 似乎没有为每个调用提供一个很好的错误条件列表。尽管某些函数在实践中不会失败(除了参数错误的情况),但它们可能在理论上会失败。就像您不应该相信用户输入一样,您也不应该盲目相信文档记录不佳的库。

我认为处理 API 的最佳方法是将所有调用包装在函数中以进行错误检查(在 API 之间和内部存在很大差异),这样您就有了一种“更高级别”的 API,其中所有特殊性被消除。然后,您可以将成功、错误和警告转换为适合您的语言的任何技术(例如异常、错误/警告回调、求和类型)。

【讨论】:

  • 我不明白你的意思。当函数返回错误时(通常是 WIN32 用语中的 0),您调用 GetLastError()(而不是在 Linux 上查找 errno)并将其与此处的列表进行比较:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 我说的第一句话的意思是某些调用只能导致某些错误代码。例如,ReadFile 导致ERROR_WRITE_PROTECTERROR_FILE_EXISTS 是没有意义的。对于单独的每个函数,可能的错误集非常小,但 Win32 API 很少记录确切的集。然而,对于 POSIX,列出并解释了所有错误代码,不仅因为它们在特定调用的上下文中具有更具体的含义,而且还因为,例如,ENOENT 错误如果由freadfgetc.
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多