windows函式為開發者提供了錯誤**,這樣當呼叫windows函式失敗後,可以通過檢視錯誤**了解錯誤資訊。相應的錯誤與主調執行緒關聯在一起,這種機制使得不同的執行緒能夠獨立執行而不會相互干擾。呼叫getlasterror 檢視錯誤**。
windows提供的錯誤**很多,相應的標頭檔案是winerror.h。
當呼叫windows函式失敗後,應當立即呼叫getlasterror來獲取錯誤**,因為每個執行緒維護乙份錯誤**,這個錯誤**會隨著函式呼叫而被更新。在visual studio中,通過在watch中輸入$err,hr顯示錯誤**和錯誤描述資訊。如果在自己開發的應用程式中,需要向使用者展示錯誤資訊,那麼可以用formatmessage將錯誤**轉換成錯誤描述資訊。生命如下
dwordwinapi
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 0x60000000bool 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的...