一、对程序的错误处理

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位的数字,划分成表所示的各个域。

 

posted @ 2013-01-22 17:08  PERPAN  阅读(193)  评论(0)    收藏  举报