共用方式為


例外狀況:從您自己的函式擲回例外狀況

個別使用 MFC 例外狀況處理範例攔截函式所擲回的例外狀況在 MFC 或其他程式庫中是可能的。 除了程式庫程式碼擲回的攔截例外狀況之外,您可以擲回從您的程式碼的例外狀況,如果您正在撰寫可能發生例外狀況的函式。

當例外狀況擲回時,目前函式的執行會停止並直接跳到最內層的例外狀況框架的 catch 區塊。 例外狀況機制略過從函式的正常結束路徑。 因此,您必須確定刪除在正常結束要刪除的記憶體區塊。

擲回例外狀況。

  1. 使用其中一個 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 );
    }
    

    如果第一個配置失敗,您可以擲回記憶體不足例外狀況。 如果第一個配置成功,但是第二個失敗,您必須在擲回例外狀況之前釋放第一個配置區塊。 如果兩個配置成功,通常可以執行和釋放區塊,當函式結束時。

     -或- 

  2. 使用使用者定義的例外狀況會指示問題的情況。 您可以擲回任何型別,甚至整個類別項目,為您的例外狀況。

    如果發生失敗,下列範例嘗試透過聲波裝置播放音效並擲回例外狀況。

    #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 的例外狀況預設處理僅適用於指標對 CExceptionCException物件 (此物件和衍生類別)。上述範例略過 MFC 的例外狀況機制。

請參閱

概念

MFC 中的例外狀況處理