Sdílet prostřednictvím


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

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 potřeba mít jistotu, že odstraníte ty bloky paměti, které by byly odstraněny při běžné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 obě alokace úspěšné, můžete pokračovat normálním způsobem a při ukončení funkce bloky uvolnit.

    • 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 CException tříd). Výše uvedený příklad obchází mechanismus výjimek mfc.

Viz také

zpracování výjimek