VS2010/MFC編程入門之四十六(MFC常用類:MFC異常處理)

上一節中雞啄米講了CFile文件操作類,本節主要來說說MFC異常處理。

       在雞啄米C++編程入門系列的最後一節雞啄米:C++編程入門系列之五十(異常處理)中,雞啄米講了C++標準異常的處理機制,如果你還沒有學過這方面內容,可以到那節教程中去學習下。

       MFC異常處理與C++標準異常處理是類似的,只是它在拋出和捕獲異常時使用了一些宏,另外還將異常封裝到了CException類及其派生類中。下面就分別講解這些宏與異常類。

       MFC異常宏

       MFC提供的異常處理宏包括TRY、CATCH、AND_CATCH、END_CATCH、THROW、THROW_LAST等,大家看着名稱是不是與C++標準異常處理的關鍵字相似?它們實際上就是在try、catch和throw的基礎上定義的。雞啄米下面貼出MFC中這些宏的定義:

C++代碼
  1. /////////////////////////////////////////////////////////////////////////////   
  2. // Exception macros using try, catch and throw   
  3. //  (for backward compatibility to previous versions of MFC)   
  4.   
  5. #define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try {   
  6.   
  7. #define CATCH(class, e) } catch (class* e) \   
  8.     { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \   
  9.         _afxExceptionLink.m_pException = e;   
  10.   
  11. #define AND_CATCH(class, e) } catch (class* e) \   
  12.     { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \   
  13.         _afxExceptionLink.m_pException = e;   
  14.   
  15. #define END_CATCH } }   
  16.   
  17. #define THROW(e) throw e   
  18. #define THROW_LAST() (AfxThrowLastCleanup(), throw)   
  19.   
  20. // Advanced macros for smaller code   
  21. #define CATCH_ALL(e) } catch (CException* e) \   
  22.     { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \   
  23.         _afxExceptionLink.m_pException = e;   
  24.   
  25. #define AND_CATCH_ALL(e) } catch (CException* e) \   
  26.     { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \   
  27.         _afxExceptionLink.m_pException = e;   
  28.   
  29. #define END_CATCH_ALL } } }   
  30.   
  31. #define END_TRY } catch (CException* e) \   
  32.     { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \   
  33.         _afxExceptionLink.m_pException = e; } }  

       可以看出這些宏的定義中都包含了相應的C++異常處理關鍵字,本質上還是要通過try、catch和throw實現。

MFC異常處理

       MFC異常類

       MFC將對異常的處理封裝到了異常類--CException類及其子類中。其實即使我們不使用MFC異常宏而是使用C++標準異常處理的話,也是會用到MFC的CException類及其子類的。MFC異常類及其含義如下表:

MFC異常類 含義
CSimpleException 資源緊張異常的基類
CInvalidArgException 無效參數異常
CMemoryException 內存不足
CNotSupportedException 響應對不支持服務的請求
CArchiveException 存檔/序列化異常
CFileException 文件異常
CResourceException Windows 資源分配異常
COleException OLE 異常
CDBException 數據庫異常(ODBC 類)
COleDispatchException 調度(自動化)異常
CUserException 用消息框警告用戶然後引發一般 CException 的異常
CDaoException 數據庫異常(DAO 類)
CInternetException 網絡異常

        MFC異常處理

        MFC異常處理的TRY塊的形式如下:

TRY  
{  
         複合語句  
}  
CATCH (MFC異常類名, 變量名)  
{  
         複合語句  
}  
AND_CATCH (MFC異常類名, 變量名)  
{  
         複合語句  
}  
AND_CATCH (MFC異常類名, 變量名)  
{  
         複合語句  
}  
......  
END_CATCH

       說明:TRY後的一對大括號內包含了可能會拋出異常的代碼塊;用CATCH子句捕獲並處理異常,它捕獲的是指向異常對象的指針,小括號中的“MFC異常類名”就是CException類或其子類的名稱,變量名代表的就是“MFC異常類名”類型的指針變量;如果拋出的異常類型與CATCH子句中的不一致,則對後面的所有AND_CATCH子句依次檢查,若子句的異常類型與拋出異常類型一致則由其捕獲並處理此異常;最後用END_CATCH結束整個TRY塊。

       注意:MFC異常宏只能捕獲處理CException及其子類類型的異常

       我們在使用MFC類時,有些會自動拋異常,當然我們可以在需要的情況下使用AfxThrow******()自己拋異常,這裏的******與上面MFC異常類列表中的各個異常類對應,例如拋文件異常可以使用AfxThrowFileException(),參數可以查閱MSDN。

       MFC異常處理實例

       雞啄米給大家一個簡單的MFC異常處理的代碼段,瞭解下如何使用MFC異常處理即可。

C++代碼
  1. TRY   
  2. {   
  3.     CFile file(_T("C:\\1.txt"), CFile::modeRead);   // 構造CFile對象file,並以只讀模式打開一個文件,如果不存在則拋出CFileException異常   
  4. }   
  5. CATCH (CFileException, e)   
  6. {   
  7.     if (e->m_cause == CFileException::fileNotFound)   
  8.     {   
  9.         // 如果捕獲到CFileException異常且爲文件未找到時,彈出提示對話框   
  10.         MessageBox(_T("file not found!"));   
  11.         return;   
  12.     }   
  13. }   
  14. END_CATCH  

       上面這段代碼的意義很簡單,就是打開一個文件C:\1.txt,如果此文件不存在,則拋出CFileException異常,由CATCH子句捕獲後判斷是否是文件未找到,如果是則彈出提示對話框並返回。

       再將上面的代碼稍微修改下,以演示AfxThrow******()拋異常的用法:

C++代碼
  1. TRY   
  2. {   
  3.     AfxThrowFileException(CFileException::fileNotFound);   // 手動拋出CFileException異常   
  4. }   
  5. CATCH (CFileException, e)   
  6. {   
  7.     if (e->m_cause == CFileException::fileNotFound)   
  8.     {   
  9.         // 如果捕獲到CFileException異常且爲文件未找到時,彈出提示對話框   
  10.         MessageBox(_T("file not found!"));   
  11.         return TRUE;   
  12.     }   
  13. }   
  14. END_CATCH  

       上面這段代碼執行時,在CATCH子句中會捕獲到文件異常。

       最後提醒大家一下,MFC的建議是不再使用MFC異常宏,而是直接使用C++標準異常,它更加靈活。雞啄米謝謝您對本站的持續關注,希望常回來看看。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章