Chapter1 : 错误处理

WinError.h包含了一个微软的错误编码列表

一个Widnows错误由三个部分组成:

  • MessageID :一个宏定义与Number联系,一般用这个来和GetLastError进行比较
  • Message Text: 错误内容
  • Number: 错误号码,尽量避免错误号码,使用MessageID

当Windows函数出错时,应该尽快使用GetLastError()获得错误编号,不能可能会被后续的Windows 函数的结果覆盖。

一些Windows函数可能因为多种原因成功,比如试图创建一个named event kernel object ,在成功创建对象和系统中已经存在相同命名的对象时都会返回成功。

在使用VS调试时,在Watch 中添加 $err,hr 。可以实时查看当前的Error Code和对应的文本信息。

 

一个Error Code由32bit组成。

第29位定义了,当前ErrorCode是否由微软定义,如果是自己定义的Error Code这一位必须为0

Facility Code有4096种可能值,头256位由微软保留使用。

 

Error Code可以通过FormatMessage函数,获得对应的Message Text.典型程序如下

1 DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
2
3       // Get the error code’s textual description
4       BOOL fOk = FormatMessage(
5          FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
6          FORMAT_MESSAGE_ALLOCATE_BUFFER,
7          NULL, dwError, systemLocale,
8          (PTSTR) &hlocal, 0, NULL);
9
10       if (!fOk) {
11          // Is it a network-related error?
12          HMODULE hDll = LoadLibraryEx(TEXT(“netmsg.dll”), NULL,
13             DONT_RESOLVE_DLL_REFERENCES);
14
15          if (hDll != NULL) {
16             fOk = FormatMessage(
17                FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS |
18                FORMAT_MESSAGE_ALLOCATE_BUFFER,
19                hDll, dwError, systemLocale,
20                (PTSTR) &hlocal, 0, NULL);
21             FreeLibrary(hDll);
22          }
23       }