Windows核心編程__錯誤處理

來源:互聯網
上載者:User

 

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.