文章內容
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."));
}