Windows開發筆記 錯誤處理

2022-05-19 06:14:40 字數 1745 閱讀 8305

windows函式為開發者提供了錯誤**,這樣當呼叫windows函式失敗後,可以通過檢視錯誤**了解錯誤資訊。相應的錯誤與主調執行緒關聯在一起,這種機制使得不同的執行緒能夠獨立執行而不會相互干擾。呼叫getlasterror 檢視錯誤**。

windows提供的錯誤**很多,相應的標頭檔案是winerror.h。

當呼叫windows函式失敗後,應當立即呼叫getlasterror來獲取錯誤**,因為每個執行緒維護乙份錯誤**,這個錯誤**會隨著函式呼叫而被更新。在visual studio中,通過在watch中輸入$err,hr顯示錯誤**和錯誤描述資訊。如果在自己開發的應用程式中,需要向使用者展示錯誤資訊,那麼可以用formatmessage將錯誤**轉換成錯誤描述資訊。生命如下

dword

winapi

formatmessagew(

__in dword dwflags,

__in_opt lpcvoid lpsource,

__in dword dwmessageid,

__in dword dwlanguageid,

__out lpwstr lpbuffer,

__in dword nsize,

__in_opt va_list *arguments

);

同時也可以自己定義錯誤**,為了指出錯誤,只需設定執行緒的上乙個錯誤**,然後讓自己的函式的返回flase,invalid_handle_value,null的值,呼叫setlasterror傳入自定義錯誤**。這個錯誤**的的制定也不是隨便乙個32位整數就可以,需要根據每一位的意義去設定。

錯誤**的不同字段

31-30      嚴重性  0: 成功   1 :資訊  2:  警告   3

: 錯誤

29 ms/客戶 0 : ms 1

: 客戶

28 保留 0

27-16

facility 前256個值由ms保留

15-0 異常**

需要通過上述規則去編寫錯誤**。

#define error_not_checked              0x60000000

bool ischecked(bool

checked

)

return

true;}

intmain()

; lpvoid lpmsgbuf;

formatmessage(

format_message_allocate_buffer |format_message_from_system |format_message_ignore_inserts,

null,

getlasterror(),

makelangid(lang_neutral, sublang_default),

(lptstr) &lpmsgbuf,

0, null

); messagebox(null,(lpcwstr)lpmsgbuf,null,mb_ok);

localfree( lpmsgbuf );

}ischecked(

false

); printf(

"%x\n

",getlasterror());

return0;

}

Swift學習筆記 錯誤處理

錯誤分為可恢復的錯誤和不可恢復的錯誤,可恢復的錯誤指的是能預見並處理的錯誤,例如檔案不存在,網路連線失敗等 不可恢復的錯誤指的是一類特殊的bug,例如強制展開值為nil的可空例項,陣列越界訪問等 如果發生錯誤沒有處理,程式就會停止執行。遺憾的是swift中似乎只能處理可恢復的錯誤。swift中使用a...

python學習筆記 錯誤處理

程式中的錯誤處理有多種方式,一類是約定好錯誤碼,然後根據返回的錯誤碼來判斷是否發生錯誤,以及錯誤的原因。但是這麼做容易將正確的返回值和錯誤碼混在一起,必須要寫很多 來區分,非常不方便。另外一旦出錯,還需要一級一級往上報,知道有一級可以處理它。比較成熟的做法是try.except.finally.這一...

rust學習筆記 錯誤處理

rust的錯誤分兩種 rust提供了可恢復錯誤的型別result t,e 與不可恢復錯誤時終止執行的panic!巨集。程式會在panic!巨集執行時列印出一段錯誤提示資訊,展開並清理當前的呼叫棧,然後退出程式,這種情況大部分都發生在某個錯誤被檢測到,但程式設計師卻不知道該如何處理的時候。panic的...