AvI*_*Imd 0 c++ error-handling winapi
有一个庞大的遗留代码库似乎在一些难以重现和调查的情况下失败.
它调用一些WinAPI函数,比如CopyFile,而不是检查返回码,检查GetLastError()值.我知道这是错误的,但是知道非空的最后错误值是来自此调用还是先前发生的事情真的很好.如果我确定CopyFile设置了最后一个错误ERROR_SUCCESS以防一切顺利,那么就足以断定这个特定的调用失败了.
MSDN提到某些功能可以做到这一点,而有些则没有,但没有具体说明哪些功能.是否有一些非正式的清单/参考文献涵盖了这个问题?
GetLastError()使用情况按功能记录.没有单一的主列表记录了哪些功能在哪个方面起作用GetLastError().如果任何给定的功能没有记录为设定的最后一个错误,不要使用GetLastError()该函数退出后检查的最后一个错误.
设置最后一个错误的大多数函数都不会将其设置为成功,仅在失败时设置,并记录为这样.
其功能也设置成功的最后一个错误被记录为这样,也将记录其成功的条件设定的最后一个错误,其价值.这通常用于函数的返回值关于函数是成功还是失败的模糊不清的情况,因此GetLastError()用于区分.例如,大多数函数在失败时返回0,但某些函数可能在成功和失败时返回0.在这种情况下,如果GetLastError()然后返回0(或定义的成功代码),则函数成功,否则函数失败. GetTLSValue()就是这方面的一个例子.
一个值得注意的例外是创建命名内核对象功能(CreateMutex(),CreateEvent(),CreateSemaphore()等).它们在成功时返回非零值,但也GetLastError()将返回0或 ERROR_ALREADY_EXISTS取决于函数是否返回新创建的对象或现有对象的句柄.相应地记录了每个功能.