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 ??梢允褂肊rror 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 =錯誤 |
|
|