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