一、对程序的错误处理
1、windows常用的返回值类型
1)VOID 很少返回值是VOID
2)BOOL 失败为0,成功为非0。不要测试返回值是否为TRUE
3)HANDLE 失败为NULL(有些函数返回一个句柄值INVLID_HANDLE_VALUE,它被定义为-1),成功为句柄
4)PVOID 失败为NULL,成功PVOID,以标识数据库的内存地址
5)LONG/DWORD 不同的函数返回的值不同,需查看Platform SDK文档
2、获取错误信息
一个Windows函数返回的错误代码对了解该函数为什么会运行失败常常很有用。 Microsoft公司编译了一个所有可能的错误代码的列表,并且为每个错误代码分配了一个32位的号码。从系统内部来讲,当一个Windows函数检测到一个错误时,它会使用一个称为线程本地存储器(thread-local storage)的机制,将相应的错误代码号码与调用的线程关联起来。这将使线程能够互相独立地运行,而不会影响各自的错误代码。当函数返回时,它的返回值就能指明一个错误已经发生。若要确定这是个什么错误,请调用GetLastError函数:
DWORD GetLastError();
该函数只返回线程的32位错误代码。当你拥有32位错误代码的号码时,必须将该号码转换成更有用的某种对象。WinError.h头文件包含了Microsoft公司定义的错误代码的列表。
有些Windows函数之所以能够成功运行,其中有许多原因。例如,创建指明的事件内核对象之所以能够取得成功,是因为你实际上创建了该对象,或者因为已经存在带有相同名字的事件内核对象。你应搞清楚成功的原因。为了将该信息返回,Microsoft公司选择使用最后错误代码机制。这样,当某些函数运行成功时,就能够通过调用GetLastError函数来确定其他的一些信息。对于具有这种行为特性的函数来说,Platform SDK文档清楚地说明了GetLastError函数可以这样使用。请参见该文档,找出CreateEvent函数的例子。
注:GetLastError函数既可以返回错误原因,也可以返回成功的原因。
3、显示错误的文本描述
GetLastError函数返回的是错误代码,例如0x00000002,将错误代码转换成文本描述使用函数:
DWORD FormatMessage(
DWORD dwFlags,
LPCVOID pSource,
DWORD dwMessageId,
DWORD dwLanguageId,
PTSTR pszBuffer,
DWORD nSize,
va_list *Arguments);
4、定义自己的错误代码
前面已经说明 Wi n d o w s函数是如何向函数的调用者指明发生的错误,你也能够将该机制用于自己的函数。比如说,你编写了一个希望其他人调用的函数,你的函数可能因为这样或那样的原因而运行失败,你必须向函数的调用者说明它已经运行失败。若要指明函数运行失败,只需要设定线程的最后的错误代码,然后让你的函数返回FALSE、INVALID_HANDLE_VALUE、NULL或者返回任何合适的信息。若要设定线程的最后错误代码,只需调用下面的代码:
VOID SetLastError(DWORD dwErrCode);
请将你认为合适的任何3 2位号码传递给该函数。尝试使用 WinError.h中已经存在的代码,只要该代码能够正确地指明想要报告的错误即可。如果你认为WinError.h中的任何代码都不能正确地反映该错误的性质,那么可以创建你自己的代码。错误代码是个 3 2位的数字,划分成表所示的各个域。

浙公网安备 33010602011771号