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 =錯誤 |
|
|