Windows中的錯誤處理

2022-02-19 12:13:10 字數 2212 閱讀 9915

當使用乙個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檢索發生錯誤的軸號。這通常用於錯誤處理...