您可以使用 MFC 例外處理範式,只捕捉 MFC 或其他函式庫中函式擲回的例外狀況。 除了擷取函式庫程式碼擲回的例外狀況之外,若您正在撰寫可能會遇到例外狀況的函式,也可以從自己的程式碼擲回例外狀況。
擲回例外狀況時,會停止目前函式的執行,並直接跳至 catch 最內層例外狀況框架的 區塊。 例外機制會繞過函式的正常結束路徑。 因此,您必須務必刪除在正常結束時刪除的記憶體區塊。
拋出例外狀況
使用其中一個 MFC 協助程式函式,例如
AfxThrowMemoryException。 這些函式會擲回適當類型的預先配置例外狀況物件。在下列範例中,函式會嘗試配置兩個記憶體區塊,並在任一配置失敗時擲回例外狀況:
{ char* p1 = (char*)malloc(SIZE_FIRST); if (p1 == NULL) AfxThrowMemoryException(); char* p2 = (char*)malloc(SIZE_SECOND); if (p2 == NULL) { free(p1); AfxThrowMemoryException(); } // ... Do something with allocated blocks ... // In normal exit, both blocks are deleted. free(p1); free(p2); }如果第一次記憶體分配失敗,您可以直接拋出記憶體例外狀況。 如果首次配置成功,但第二次配置失敗,您必須在擲回例外前釋放首次配置的區塊。 如果這兩個配置都成功,您可以正常繼續並在函式結束時釋放區塊。
- 或-
使用使用者定義的例外狀況來指出問題狀況。 您可以拋出任何類型的項目,甚至是整個類,作為例外。
下列範例會嘗試透過聲音裝置播放音效,如果失敗,則會產生例外狀況。
#define WAVE_ERROR -5 { // This Win32 API returns 0 if the sound cannot be played. // Throw an integer constant if it fails. if (!PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC)) throw WAVE_ERROR; }
備註
MFC 的預設例外狀況處理僅適用於指向 CException 物件的指標(以及 CException 衍生類別物件的指標)。 上述範例會略過 MFC 的例外狀況機制。