例外狀況:從您自己的函式擲回例外狀況
可以只使用 MFC 例外狀況處理範例,來攔截 MFC 或其他程式庫中的函式所擲回的例外狀況。 除了攔截程式庫程式碼擲回的例外狀況之外,如果您正在撰寫可能發生例外狀況的函式,還可以從您自己的程式碼擲回例外狀況。
擲回例外狀況時,會停止目前函式的執行,並直接跳至 catch
最內層例外狀況框架的 區塊。 例外狀況機制會略過從函式的正常結束路徑。 因此,您必須確定刪除在正常結束要刪除的記憶體區塊。
擲回例外狀況
使用其中一個 MFC helper 函式,例如
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 的例外狀況機制。