一、Win32錯誤
也就是Win32子系統産生的錯誤。當我們在自己的代碼裡調用Windows系統的API函數,系統執行API内部代碼,當API内部代碼出現錯誤,會将預先定義好的錯誤代碼寫到調用這個API的線程局部存儲區域(這個區域是每個線程獨有的其他線程無法更改。它存儲着一些線程獨有的東西),然後API傳回,傳回值告訴我們該API執行失敗了。如果我們的代碼加了檢測,發現了API失敗,這時我們調用GetLastError() 函數去擷取這個錯誤代碼,這個錯誤代碼是一個DWORD值。如果我們不及時擷取,就會被後面調用的API所覆寫。當我們想在自己的函數裡借用這種機制時,可以調用SetLastError函數來設定一個錯誤代碼。
這裡我們提到了兩個API:
DWORD GetLastError(VOID)
void SetLastError(DWORD dwErrCode)
二、Win32 Error Code
所有Win32錯誤代碼都必須在0x0000到0xFFFF範圍内,盡管Win32錯誤代碼可以同時用于16位字段和32位字段,我們通常還是用32位來表示。大多數值已經定義了預設錯誤消息,可用于将值映射到我們可以讀懂的文本消息。它的構成如下:
雖然win32子系統錯誤的位域有32bit,但受限于值的範圍,也隻能是0x00000000---0x0000FFF,也就是上面的位域高16bit都是0。
三、擷取錯誤具體資訊
<code>通過前面的說明我們了解了錯誤代碼的擷取,以及錯誤代碼和資訊是怎麼制作出來的,那麼當我們用GetLastError擷取到錯誤代碼後,我們隻是有了一個編号,還是不了解具體什麼原因什麼錯誤,這時,我們該用到另外一個函數了FormatMessage。</code>
<code>原型:</code>
<code>DWORD</code> <code>WINAPI FormatMessage (</code>
<code> </code><code>DWORD</code> <code>dwFlags, </code><code>// source and processing options</code>
<code> </code><code>LPCVOID</code> <code>lpSource, </code><code>// message source</code>
<code> </code><code>DWORD</code> <code>dwMessageId, </code><code>// message identifier</code>
<code> </code><code>DWORD</code> <code>dwLanguageId, </code><code>// language identifier</code>
<code> </code><code>LPTSTR</code> <code>lpBuffer, </code><code>// message buffer</code>
<code> </code><code>DWORD</code> <code>nSize, </code><code>// maximum size of message buffer</code>
<code> </code><code>va_list</code> <code>*Arguments </code><code>// array of message inserts</code>
<code> </code><code>);</code>
它的功能就是将GetLastError函數得到的錯誤資訊(這個錯誤資訊是數字代号)轉化成字元串資訊的函數。
四、總結
我們可以自定義錯誤代碼和資訊,通過SetLastError來實作我們自己的代碼的錯誤處理機制,然後通過系統API或自定義函數的傳回值,檢測函數是否失敗,若失敗,通過GetLastError函數擷取線程裡目前的錯誤代碼,在通過<code>FormatMessage</code>來查詢錯誤資訊,寫到我們自己的日志裡,來幫助我們調試程式的功能性和業務性問題。