本文說明 MFC 中可用的例外狀況處理機制。 有兩種機制可供使用:
C++例外狀況,適用於 MFC 3.0 版和更新版本
MFC 例外狀況巨集,適用於 MFC 1.0 版和更新版本
如果您要使用 MFC 撰寫新的應用程式,您應該使用C++機制。 如果您的現有應用程式已廣泛使用該機制,您可以使用巨集式機制。
您可以輕鬆地轉換現有的程序代碼,以使用C++例外狀況,而不是 MFC 例外狀況巨集。 轉換程式代碼的優點和執行此動作的指導方針,請參閱 例外狀況:從 MFC 例外狀況巨集轉換一文。
如果您已經使用 MFC 例外狀況巨集開發應用程式,您可以在現有的程式代碼中繼續使用這些巨集,同時在新的程式碼中使用C++例外狀況。 例外狀況:3.0 版例外狀況巨集的變更一文提供執行此動作的指導方針。
備註
若要在您的程式代碼中啟用C++例外狀況處理,請在專案 [屬性頁 ] 對話方塊的 [C/C++] 資料夾的 [程式代碼產生] 頁面上選取 [啟用C++例外狀況],或使用 /EHsc 編譯程序選項。
本文涵蓋下列主題:
使用例外狀況的時機
在程式執行期間呼叫函式時,可能會發生三種結果:一般執行、錯誤執行或異常執行。 每個類別如下所述。
正常執行
函式可以正常執行並傳回。 某些函式會將結果碼傳回給呼叫端,表示函式的結果。 可能的結果碼會嚴格定義給函式,並代表函式可能的結果範圍。 結果程式代碼可以指出成功或失敗,甚至可能表示預期範圍內的特定失敗類型。 例如,檔案狀態函式可以傳回指出檔案不存在的程序代碼。 請注意,「錯誤碼」一詞不會使用,因為結果碼代表許多預期結果的其中一個。
錯誤執行
呼叫者在將參數傳遞給函式或在不適當的情境中呼叫函式時犯了一些錯誤。 這種情況會造成錯誤,應該在程式開發期間由斷言偵測到。 如需判斷提示的詳細資訊,請參閱 C/C++判斷提示。
異常執行
異常執行包括程式控制之外的情況,例如記憶體不足或 I/O 錯誤,會影響函式的結果。 異常情況應該藉由攔截和拋出例外狀況來處理。
使用例外特別適用於處理異常的程式執行。
MFC 例外狀況支援
不論您是直接使用 C++ 例外還是 MFC 例外巨集,您都會使用 CException 類別 或架構或應用程式可能擲回的衍生物件。
下表顯示 MFC 所提供的預先定義例外狀況。
| Exception 類別 | 意義 |
|---|---|
| CMemoryException 類別 | 記憶體不足 |
| CFileException 類別 | 檔案例外狀況 |
| CArchiveException 類別 | 封存/串行化例外狀況 |
| CNotSupportedException 類別 | 對於不支援服務要求的回應 |
| CResourceException 類別 | Windows 資源配置例外狀況 |
| CDaoException 類別 | 資料庫例外狀況 (DAO 類別) |
| CDBException 類別 | 資料庫例外狀況 (ODBC 類別) |
| COleException 類別 | OLE 例外狀況 |
| COleDispatchException 類別 | 分派 (自動化) 例外狀況 |
| CUserException 類別 | 以消息框警示使用者的例外狀況,然後擲回泛型 CException 類別 |
自 3.0 版以來,MFC 已使用 C++ 異常,但仍支援其舊有的異常處理巨集,形式上與 C++ 異常類似。 雖然這些巨集不建議用於新程式設計,但它們仍支援向後相容性。 在已經使用巨集的程式中,您也可以自由使用C++例外狀況。 在前置處理期間,巨集會評估為從Visual C++ 2.0版開始,C++語言的 MSVC 實作中所定義的例外狀況處理關鍵詞。 當您開始使用C++例外時,您可以保留現有的例外巨集。 如需有關混合使用巨集和 C++ 例外處理,以及將舊代碼轉換為新機制的資訊,請參閱文章 例外狀況:使用 MFC 巨集和 C++ 例外處理 和 例外狀況:將 MFC 例外巨集轉換。 如果您仍然使用舊版 MFC 例外處理巨集,它們將對應於 C++ 的例外狀況關鍵詞。 請參閱 例外:版本 3.0 中例外巨集的變更。 MFC 不會直接支援 Windows NT 結構化例外狀況處理程式 (SEH),如 結構化例外狀況處理中所述。
進一步閱讀例外狀況
下列文章說明如何使用 MFC 函式庫進行例外處理:
下列文章比較 MFC 例外狀況巨集與C++例外狀況關鍵詞,並說明如何調整程式代碼: