當使用乙個win api函式時,它會檢驗引數的有效性,然後再設法去執行任務.如果傳遞了乙個無效引數,或者是由於某種原因使程式無法正確執行,那作業系統就會返回乙個值,指明該函式在某種程度上執行失敗了.windows中的函式有5種返回值型別.
void 表示這種函式執行不可能失敗,或者不必關心其失不失敗. windows函式很少是這種型別.而我們平時寫**中,也應該盡量寫有返回值的函式,除非你真的確定它中途不會出意外.
bool 如果執行失敗它會返回0,如果成功則是非0. 因此,可以通過檢測它的返回值是0還是非0來判斷乙個函式有沒有執行成功. 注意,請不要寫出這樣的** if( ret == true). 這樣做是很不安全的,因為bool不僅只有0和1.它在windef.h中被定義, typedef int bool;
handle 如果函式失敗,通常返回null,否則返回handle值,用於標識你可以操作的乙個物件. 但是,某些函式的返回值則是invalid_handle_value, 它被定義為 -1 . sdk文件在介紹每個函式時都說明了其返回值的含義.用的時候要小心. createfile就是這樣的乙個函式.
long/dword 這個值比較難以處理,通常這是一種返回數量的函式.如果由於某種原因,函式無法對想要的進行計數,那反該函式通常返回0或-1 (這也是根據相關函式而定). 用的時候要格外小心.
另外,windows 中定義了一套錯誤**列表,用由指明當前api執行後的錯誤資訊. 可以通過getlasterror函式來取得.像這樣.
返回值 er中便存放了createfile呼叫後,系統記錄的錯誤**. 並且可們可以看到,hfile的值為invalid_handle_value。
注意:並不是每個api函式的呼叫都會更改這個錯誤**.某些函式在執行成功時就不會修改. 這個要特別注意.
我們可以通過在vc環境下的"監視"視窗中輸入 @err,hr 回車後右邊的資訊視窗中便會顯示出當前錯誤**對應的資訊提示資訊.
像上面這個列子,我們將斷點設定在 return 0;這一行上,當執行到此後,我們按上面的方法去做. 你會發現監視視窗中會出現如下提示
@err,hr 0x00000002 系統找不到指定的檔案。
當然,我們也可以通過錯誤**輸出格式化字串,下面的函式可以做到這一點.
dword formatmessage(
dword dwflags,
lpvoid psource,
dword dwmessageid,
dwrod dwlanguageid,
ptstr pszbuffer,
dword nsize;
va_list *arguments);
這個函式的功能非常強大,可以在多種語言中進行操作.
被注釋的部分是用英語輸出,而剛剛都說了,這個東西支援多國語言,於是下面就淙了支援中文的做法。 需要說明的是,這個函式的功能非常多。 剛剛僅是演示了從系統和本地buffer中取得錯誤資訊。
#define format_message_allocate_buffer 0x00000100
#define format_message_ignore_inserts 0x00000200
#define format_message_from_string 0x00000400
#define format_message_from_hmodule 0x00000800
#define format_message_from_system 0x00001000
#define format_message_argument_array 0x00002000
#define format_message_max_width_mask 0x000000ff
從它強大的定義可以看出來,支援的東西挺多的。 比如下面的組合:
format_message_from_hmodule | format_message_from_system 則可 以用於網路相關的錯誤。。
同樣的,使用者也可以自己定義錯誤**。 錯誤**是乙個32位的值。
31-30 位,標誌錯誤的嚴重性。 0 = 成功 1 = 供參考 2 = 警告 3 = 錯誤
29 位,則標誌著錯誤提供者, 0 表示由ms自己提供, 1 表示由使用者提供。所以,使用者自定的**,其29位必需為1。
28 位,保留,必須為0。
27-16 位, 由ms公司定義,標誌裝置**。
15-0 位,則是異常**,ms和客戶均要使用此位。
MySql錯誤處理 錯誤處理的例子
有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...
swift 中錯誤處理
enum customerror error 定義乙個測試用的類 class testerrorclass name s func showstring 第一種使用方式,執行 後,直接丟擲異常,中止執行 let tes trytesterrorclass s 執行結果 lldb expr 123.c...
SPEL 中的錯誤處理
spel 中的錯誤處理 專案 目的 onerr 使用onerr語句定義錯誤處理例程的位置。err 使用err檢索當前錯誤狀態的數量。在錯誤處理例程中使用這個可以確定已經發生了哪些錯誤。error 生成乙個可被錯誤處理程式捕獲的使用者定義的錯誤。era 使用era檢索發生錯誤的軸號。這通常用於錯誤處理...