Sdílet prostřednictvím


Výjimky: Generování výjimek ve vašich vlastních funkcích

Je možné použít pouze k zachycení výjimky vyvolané funkcí v knihovně MFC nebo jiných knihoven paradigma zpracování výjimek knihovny MFC.Kromě zachycení výjimek vyvolaných kód knihovny, můžete vyvolat výjimky z vlastního kódu pokud píšete funkce, které mohou nastat výjimečné podmínky.

Když je vyvolána výjimka, provádění aktuální funkce zastavena a přejde přímo skutečné blok rámce vnitřní výjimka.Mechanismus výjimek obchází Normální konec cesty z funkce.Proto musíte dbát těchto paměťových bloků, které budou odstraněny v normální ukončení odstranit.

Chcete-li vyvolat výjimku

  1. Použijte jeden z pomocné funkce knihovny MFC, jako AfxThrowMemoryException.Tyto funkce vyvolat výjimku předběžně přidělené objektu vhodného typu.

    V následujícím příkladu funkce se pokusí vyhradit dva bloky paměti a vyvolá výjimku, pokud selže buď přidělení:

    {
        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 );
    }
    

    Pokud selže první přidělení, můžete jednoduše vyvolat výjimka paměti.Pokud první přidělení je úspěšný, ale druhý nezdaří, je nutné uvolnit první alokační blok před vyvoláním výjimky.Obě přiřazení nezdaří, můžete normálně pokračovat a uvolnit bloky při ukončení funkce.

     – nebo – 

  2. Uživatel definované výjimky slouží k označení stavu problému.Položky libovolného typu, dokonce celou třídu, můžete vyvolat jako vaší výjimka.

    V následujícím příkladu se pokusí přehrát zvuk prostřednictvím zařízení wave a vyvolá výjimku, pokud dojde k selhání.

    #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;
    }
    

[!POZNÁMKA]

MFC výchozí zpracování výjimek platí pouze pro odkazy na CException objekty (objekty a CException-odvozené třídy).Výše uvedený příklad vynechá mechanismus výjimek knihovny MFC.

Viz také

Koncepty

Zpracování výjimek v prostředí MFC