Sdílet prostřednictvím


Výjimky: Vyvolání výjimky z vlastních funkcí

Je možné použít výhradně k zachycení výjimky vyvolané funkcí v MFC nebo jiných knihoven paradigma MFC zpracování výjimek.K zachycení výjimek vyvolaných kódu knihovny můžete vyvolávají výjimky z vlastního kódu Pokud psaní funkce, které mohou nastat výjimečné podmínky.

Když je vyvolána výjimka, spuštění aktuální funkce zastavena a přejde přímo úlovku bloku rámec vnitřní výjimka.Mechanismus výjimku obchází Normální konec cesty z funkce.Musí proto nezapomeňte odstranit ty paměťových bloků, které by v normálním ukončení odstraněny.

K vyvolání výjimky

  1. Použijte jeden z pomocných funkcí MFC jako AfxThrowMemoryException.Tyto funkce vyvoláním příslušného typu objektu předběžně přidělená výjimku.

    V následujícím příkladu funkce pokusí přidělit 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 vyvoláním výjimky paměti.Pokud první přidělení je úspěšný, ale druhý nezdaří, je nutné uvolnit první blok přidělení před vyvolání výjimky.Rozdělení obou úspěšně, můžete normálně pokračovat a uvolnit bloků při ukončení funkce.

     – nebo – 

  2. Výjimka se uživatelem definované slouží k označení stavu problému.Položky typu, dokonce celou třídu, lze vyvolat jako vaše 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 nedošlo 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 jeho výchozí zpracování výjimek platí pouze pro ukazatele na CException objekty (a objekty CException-odvozené třídy).Výše uvedený příklad obchází mechanismus a MFC výjimku.

Viz také

Koncepty

Zpracování výjimek v MFC