例外狀況:從您自己的函式擲回例外狀況
個別使用 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 的例外狀況機制。 |