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
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-
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.