1 windows程序错误的处理机制
windows API的返回类型
数据类型 |
表示失败的值
|
V O I D |
该函数的运行不可能失败。Wi n d o w s 函数的返回值类型很少是V O I D
|
B O O L |
如果函数运行失败,那么返回值是0 ,否则返回的是非0 值。最好对返回值进行测试,以确定它是0 还是非0 。不要测试返回值是否为T R U E
|
H A N D L E |
如果函数运行失败,则返回值通常是N U L L ,否则返回值为H A N D L E ,用于标识你可以操作的一个对象。注意,有些函数会返回一个句柄值I N VALID_ HANDLE_VA L U E ,它被定义为- 1 。函数的Platform SDK 文档将会清楚地说明该函数运行失败时返回的是N U L L 还是I N VA L I D _ H A N D L E _ VA L I D
|
P V O I D |
如果函数运行失败,则返回值是N U L L ,否则返回P V O I D ,以标识数据块的内存地址
|
L O N G / D W O R D |
这是个难以处理的值。返回数量的函数通常返回L O N G 或D W O R D 。如果由于某种原因,函数无法对想要进行计数的对象进行计数,那么该函数通常返回0 或- 1 (根据函数而定)。如果调用的函数返回了L O N G / D W O R D ,那么请认真阅读Platform SDK文档,以确保能正确检查潜在的错误
|
Wi n E r r o r. h 头文件包含了M i c r o s o f t 公司定义的错误代码的列表,每个错误都有三种表示,例如下面:
// MessageId: ERROR_PATH_NOT_FOUND
// MessageText:
// The system cannot find the path specified.
#define ERROR_PATH_NOT_FOUND 3L
当有错误发生时,可以通过下面函数得到错误的id,
DWORD GetLastError();
也可以通过下面函数由id得到对应的text:
DWORD FormatMessage(
DWORD dwFlags, // source and processing options
LPCVOID lpSource, // pointer to message source
DWORD dwMessageId, // requested message identifier
DWORD dwLanguageId, // language identifier for requested message
LPTSTR lpBuffer, // pointer to message buffer
DWORD nSize, // maximum size of message buffer
va_list *Arguments // pointer to array of message inserts
);
当调用一个API出现错误时,可以立即通过一下方法查看错误,但是后面的API的调用会覆盖调前面的错误
图1-1 在Visual Studio 6.0 的Wa t c h 窗口中键入“@ e r r, h r ”,就可以查看当前线程的最后错误代码
Visual studio 还配有一个小的实用程序,称为Error Lookup 。可以使用Error Lookup将错误代码的号码转换成相应文本描述(见图1 - 2 )。
用户也可以定义自己的错误代码,但是要建立正确的32位的id哦,不能与系统的冲突啊.
表1-2 错误代码的域
位 |
3 1 ~30 |
29 |
28 |
27~16 |
15~0 |
内容 |
严重性 |
M i c r o s o f t/客户 |
保留 |
设备代码 |
异常代码 |
含义 |
0 =成功 |
0 =M i c r o s o f t公司定义的代码 |
必须是0 |
由M i c r o s o f t公司定义 |
由Microsoft/客户定义 |
|
1 =供参考 |
1 =客户定义的代码 |
|
|
|
|
2 =警告 |
|
|
|
|
|
3 =错误 |
|
|