文章內容
1.定義自己的錯誤碼
2.ErrorShow樣本程式
在深入討論Windows提供的諸多特性之前,應該先理解各個Windows函數是如何進行錯誤處理的。
調用Windows函數時,它會先驗證我們傳給它的參數,然後再開始執行任務。如果傳入的參數無效,或者由於其他原因導致操作無法執行,則函數的傳回值將支出函數因為某些原因失敗了。下表展示了大多數Windows函數使用的傳回值的資料類型。
資料類型 指出函數調用失敗的值
—————————————————————————————————————
VOID 這個函數不可能失敗。只有極少數Windows函數的傳回值類型為VOID
—————————————————————————————————————
BOOL 如果函數失敗,傳回值為0;否則,傳回值是一個非0值。應避免測試返
回值是否為TRUE,最穩妥的方法是檢查它是否不為FALSE
—————————————————————————————————————
HANDLE 如果函數失敗,則傳回值通常為NULL;否則,HANDLE將標識一個可以操作
的對象。請注意這種傳回值,因為某些函數會返回INVALID_HANDLE_VALUE
的一個控制代碼值,它被定義成-1.函數Platform SDK文檔清楚說明了函數是返
回NULL還是INVALID_HANDLE_VALUE來標識失敗
—————————————————————————————————————
PVOID 如果函數調用失敗,則傳回值為NULL。否則,PVOID將標識一個資料區塊的
記憶體位址
—————————————————————————————————————
LONG/DWORD 這種類型比較棘手。返回計數的函數通常會返回LONG或DWORD。如果函
數出於某種原因不能對我們想要技術的東西進行計數,它通常會返回0
或者-1。
—————————————————————————————————————
Microsoft編輯了一個一個列表,其中列出了所有可能的錯誤碼,並為每個錯誤碼都分配一個32位的編號。
函數返回時,如果發生錯誤,要查看具體是什麼錯誤,情調用GetLastError函數,如下所示:
DWORD GetLastError();
此函數可以返回一個32位錯誤碼,有了32位錯誤碼,接著需要把它轉化成為更有用的資訊。Windows提供了一個函數,可以將錯誤碼轉換成為相應的文本描述,此函數為FormatMessage,聲明如下:
DWORD FormatMessage(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPSTR lpBuffer,
DWORD nSize,
va_list *Arguments
);
自己定義自己的錯誤碼
我們會盡量使用WinError.h中現有的代碼,只要代碼能很好地反應我們想報告的錯誤。如果WinError.h中的任何一個代碼都不能準確反映一個錯誤,就可以建立自己的代碼。錯誤碼是一個32位元
位 31-30 29 28 27-16 15-0
-----------------------------------------------------------------------
內容 嚴重性 Microsoft/客戶 保留 Facility代碼 異常代碼
----------------------------------------------------------------------
含義 0 = 成功 0 = Microsoft 必須為0 前256個值由 Microsoft/
1 = 資訊(提示) 定義的代碼 Microsoft保留 客戶的代碼
2 = 警告 1 = 客戶定義的
3 = 錯誤 代碼
ErrorShow樣本程式
DWORD dwError;
//獲得錯誤編碼
dwError = GetDlgItemInt(IDC_EDIT_ERRORCODE,NULL,FALSE);
HLOCAL hlocal = NULL;
BOOL fOK = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,dwError,0,
(PTSTR)&hlocal,0,NULL);
if (fOK && (hlocal != NULL))
{
SetDlgItemText(IDC_EDIT_ERRORTEXT,(PCTSTR)LocalLock(hlocal));
LocalFree(hlocal);
}
else
{
SetDlgItemText(IDC_EDIT_ERRORTEXT,TEXT("No Text Found for this ERROR number."));
}