轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2021-06-30 10:34:35.567|閱讀 410 次
概述:節(jié)中講了CFile文件操作類,MFC異常處理與C++標準異常處理是類似的,只是它在拋出和捕獲異常時使用了一些宏,另外還將異常封裝到了CException類及其派生類中。下面就分別講解這些宏與異常類。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
上一節(jié)中講了CFile文件操作類,本節(jié)主要來說說MFC異常處理。在內(nèi)容開始前為大家介紹兩款MFC界面開發(fā)控件:
在C++編程入門系列的最后一節(jié)C++編程入門系列之異常處理中,講了C++標準異常的處理機制,如果你還沒有學過這方面內(nèi)容,可以到那節(jié)教程中去學習下。
MFC異常處理與C++標準異常處理是類似的,只是它在拋出和捕獲異常時使用了一些宏,另外還將異常封裝到了CException類及其派生類中。下面就分別講解這些宏與異常類。
MFC異常宏
MFC提供的異常處理宏包括TRY、CATCH、AND_CATCH、END_CATCH、THROW、THROW_LAST等,大家看著名稱是不是與C++標準異常處理的關(guān)鍵字相似?它們實際上就是在try、catch和throw的基礎(chǔ)上定義的。雞啄米下面貼出MFC中這些宏的定義:
C++代碼
///////////////////////////////////////////////////////////////////////////// // Exception macros using try, catch and throw // (for backward compatibility to previous versions of MFC) #define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try { #define CATCH(class, e) } catch (class* e) \ { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \ _afxExceptionLink.m_pException = e; #define AND_CATCH(class, e) } catch (class* e) \ { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \ _afxExceptionLink.m_pException = e; #define END_CATCH } } #define THROW(e) throw e #define THROW_LAST() (AfxThrowLastCleanup(), throw) // Advanced macros for smaller code #define CATCH_ALL(e) } catch (CException* e) \ { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \ _afxExceptionLink.m_pException = e; #define AND_CATCH_ALL(e) } catch (CException* e) \ { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \ _afxExceptionLink.m_pException = e; #define END_CATCH_ALL } } } #define END_TRY } catch (CException* e) \ { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \ _afxExceptionLink.m_pException = e; } }
可以看出這些宏的定義中都包含了相應的C++異常處理關(guān)鍵字,本質(zhì)上還是要通過try、catch和throw實現(xiàn)。
MFC將對異常的處理封裝到了異常類--CException類及其子類中。其實即使我們不使用MFC異常宏而是使用C++標準異常處理的話,也是會用到MFC的CException類及其子類的。MFC異常類及其含義如下表:
MFC異常類 | 含義 |
CSimpleException | 資源緊張異常的基類 |
CInvalidArgException | 無效參數(shù)異常 |
CMemoryException | 內(nèi)存不足 |
CNotSupportedException | 響應對不支持服務的請求 |
CArchiveException | 存檔/序列化異常 |
CFileException | 文件異常 |
CResourceException | Windows 資源分配異常 |
COleException | OLE 異常 |
CDBException | 數(shù)據(jù)庫異常(ODBC 類) |
COleDispatchException | 調(diào)度(自動化)異常 |
CUserException | 用消息框警告用戶然后引發(fā)一般 CException 的異常 |
CDaoException | 數(shù)據(jù)庫異常(DAO 類) |
CInternetException | 網(wǎng)絡(luò)異常 |
MFC異常處理的TRY塊的形式如下:
TRY { 復合語句 } CATCH (MFC異常類名, 變量名) { 復合語句 } AND_CATCH (MFC異常類名, 變量名) { 復合語句 } AND_CATCH (MFC異常類名, 變量名) { 復合語句 } ...... END_CATCH
說明:TRY后的一對大括號內(nèi)包含了可能會拋出異常的代碼塊;用CATCH子句捕獲并處理異常,它捕獲的是指向異常對象的指針,小括號中的“MFC異常類名”就是CException類或其子類的名稱,變量名代表的就是“MFC異常類名”類型的指針變量;如果拋出的異常類型與CATCH子句中的不一致,則對后面的所有AND_CATCH子句依次檢查,若子句的異常類型與拋出異常類型一致則由其捕獲并處理此異常;最后用END_CATCH結(jié)束整個TRY塊。
注意:MFC異常宏只能捕獲處理CException及其子類類型的異常。
我們在使用MFC類時,有些會自動拋異常,當然我們可以在需要的情況下使用AfxThrow******()自己拋異常,這里的******與上面MFC異常類列表中的各個異常類對應,例如拋文件異??梢?使用AfxThrowFileException(),參數(shù)可以查閱MSDN。
MFC異常處理實例
今天給大家一個簡單的MFC異常處理的代碼段,了解下如何使用MFC異常處理即可。
C++代碼
TRY { CFile file(_T("C:\\1.txt"), CFile::modeRead); // 構(gòu)造CFile對象file,并以只讀模式打開一個文件,如果不存在則拋出CFileException異常 } CATCH (CFileException, e) { if (e->m_cause == CFileException::fileNotFound) { // 如果捕獲到CFileException異常且為文件未找到時,彈出提示對話框 MessageBox(_T("file not found!")); return; } } END_CATCH
上面這段代碼的意義很簡單,就是打開一個文件C:\1.txt,如果此文件不存在,則拋出CFileException異常,由CATCH子句捕獲后判斷是否是文件未找到,如果是則彈出提示對話框并返回。
再將上面的代碼稍微修改下,以演示AfxThrow******()拋異常的用法:
C++代碼
TRY { AfxThrowFileException(CFileException::fileNotFound); // 手動拋出CFileException異常 } CATCH (CFileException, e) { if (e->m_cause == CFileException::fileNotFound) { // 如果捕獲到CFileException異常且為文件未找到時,彈出提示對話框 MessageBox(_T("file not found!")); return TRUE; } } END_CATCH
上面這段代碼執(zhí)行時,在CATCH子句中會捕獲到文件異常。
最后提醒大家一下,MFC的建議是不再使用MFC異常宏,而是直接使用C++標準異常,它更加靈活。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: