Výjimky: Generování výjimek ve vašich vlastních funkcích
Je možné použít pouze k zachycení výjimky vyvolané funkcí v knihovně MFC nebo jiných knihoven paradigma zpracování výjimek knihovny MFC.Kromě zachycení výjimek vyvolaných kód knihovny, můžete vyvolat výjimky z vlastního kódu pokud píšete funkce, které mohou nastat výjimečné podmínky.
Když je vyvolána výjimka, provádění aktuální funkce zastavena a přejde přímo skutečné blok rámce vnitřní výjimka.Mechanismus výjimek obchází Normální konec cesty z funkce.Proto musíte dbát těchto paměťových bloků, které budou odstraněny v normální ukončení odstranit.
Chcete-li vyvolat výjimku
Použijte jeden z pomocné funkce knihovny MFC, jako AfxThrowMemoryException.Tyto funkce vyvolat výjimku předběžně přidělené objektu vhodného typu.
V následujícím příkladu funkce se pokusí vyhradit 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 vyvolat výjimka paměti.Pokud první přidělení je úspěšný, ale druhý nezdaří, je nutné uvolnit první alokační blok před vyvoláním výjimky.Obě přiřazení nezdaří, můžete normálně pokračovat a uvolnit bloky při ukončení funkce.
– nebo –
Uživatel definované výjimky slouží k označení stavu problému.Položky libovolného typu, dokonce celou třídu, můžete vyvolat jako vaší 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 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]
MFC výchozí zpracování výjimek platí pouze pro odkazy na CException objekty (objekty a CException-odvozené třídy).Výše uvedený příklad vynechá mechanismus výjimek knihovny MFC.