分享方式:


MFC 中的例外狀況處理

本文說明 MFC 中可用的例外狀況處理機制。 有兩種機制可供使用:

  • MFC 3.0 版和更新版本中提供的 C++ 例外狀況

  • 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 類別 或由架構或 CException 應用程式擲回的衍生物件。

下表顯示 MFC 所提供的預先定義例外狀況。

Exception 類別 意義
CMemoryException 類別 記憶體不足
CFileException 類別 檔案例外狀況
CArchiveException 類別 封存/序列化例外狀況
CNotSupportedException 類別 回應不支援的服務要求
CResourceException 類別 Windows 資源配置例外狀況
CDaoException 類別 資料庫例外狀況 (DAO 類別)
CDBException 類別 資料庫例外狀況 (ODBC 類別)
COleException 類別 OLE 例外狀況
COleDispatchException 類別 分派 (自動化) 例外狀況
CUserException 類別 以訊息方塊警示使用者的例外狀況,然後擲回泛型 CException 類別

從 3.0 版開始,MFC 使用了 C++ 例外狀況,但是仍支援舊有的例外狀況處理巨集,其形式類似 C++ 例外狀況。 雖然不建議新的程式設計使用這些巨集,但是仍然支援它們以提供回溯相容性。 在已經使用巨集的程式中,您也可以使用 C++ 例外狀況而不受限制。 在前置處理期間,宏會評估 C++ 語言 MSVC 實作中所定義的例外狀況處理關鍵字,從 Visual C++ 2.0 版開始。 在您開始使用 C++ 例外狀況時,可以保留現有的例外狀況巨集。 如需混合宏和 C++ 例外狀況處理,以及轉換舊程式碼以使用新機制的相關資訊,請參閱例外狀況:使用 MFC 宏和 C++ 例外狀況和 例外狀況:從 MFC 例外 狀況宏 轉換一文 。 如果您仍然使用舊版的 MFC 例外狀況巨集,它們會判斷值為 C++ 例外狀況關鍵字。 請參閱 例外狀況:3.0 版例外狀況宏的變更。 MFC 不會直接支援 Windows NT 結構化例外狀況處理常式 (SEH),如結構化例外狀況處理 中所述

進一步閱讀例外狀況

下列文章說明如何使用 MFC 程式庫進行例外狀況處理:

下列文章將 MFC 例外狀況宏與 C++ 例外狀況關鍵字進行比較,並說明如何調整程式碼:

另請參閱

例外狀況和錯誤處理的新式 C++ 最佳做法