Sdílet prostřednictvím


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

Paradigma zpracování výjimek MFC je možné použít pouze k zachycení výjimek vyvolaných funkcemi v prostředí MFC nebo jiných knihovnách. Kromě zachycení výjimek vyvolaných kódem knihovny můžete vyvolat výjimky z vlastního kódu, pokud píšete funkce, které můžou narazit na výjimečné podmínky.

Při vyvolání výjimky je spuštění aktuální funkce zastaveno a přeskočí přímo do catch bloku nejvnitřnějšího rámce výjimky. Mechanismus výjimky obchází normální výstupní cestu funkce. Proto je nutné odstranit tyto bloky paměti, které by byly odstraněny v normálním ukončení.

Vyvolání výjimky

  1. Použijte některou z pomocných funkcí MFC, například AfxThrowMemoryException. Tyto funkce můžou vyvolat předem přidělený objekt výjimky příslušného typu.

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

    {
    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 první přidělení selže, můžete jednoduše vyvolat výjimku paměti. Pokud je první přidělení úspěšné, ale druhý z nich selže, musíte před vyvolání výjimky uvolnit první blok přidělení. Pokud jsou oba přidělení úspěšné, můžete při ukončení funkce pokračovat normálně a uvolnit bloky.

    • Nebo-
  2. K označení podmínky problému použijte výjimku definovanou uživatelem. Jako výjimku můžete vyvolat položku libovolného typu, dokonce i celou třídu.

    Následující příklad se pokusí přehrát zvuk prostřednictvím vlnového zařízení 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

Výchozí zpracování výjimek mfc se vztahuje pouze na ukazatele na CException objekty (a objekty odvozených CExceptiontříd). Výše uvedený příklad obchází mechanismus výjimek mfc.

Viz také

Zpracování výjimek