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