Wyjątki: zgłaszanie wyjątków z własnych funkcji
Można użyć paradygmatu obsługi wyjątków MFC wyłącznie w celu przechwycenia wyjątków zgłaszanych przez funkcje w MFC lub innych bibliotekach. Oprócz przechwytywania wyjątków zgłaszanych przez kod biblioteki można zgłaszać wyjątki z własnego kodu, jeśli piszesz funkcje, które mogą napotkać wyjątkowe warunki.
Gdy zgłaszany jest wyjątek, wykonanie bieżącej funkcji jest zatrzymywane i przechodzi bezpośrednio do catch
bloku najbardziej wewnętrznej ramki wyjątku. Mechanizm wyjątku pomija normalną ścieżkę wyjścia z funkcji. W związku z tym należy pamiętać o usunięciu tych bloków pamięci, które zostaną usunięte w normalnym wyjściu.
Aby zgłosić wyjątek
Użyj jednej z funkcji pomocnika MFC, takich jak
AfxThrowMemoryException
. Te funkcje zgłaszają wstępnie przydzielony obiekt wyjątku odpowiedniego typu.W poniższym przykładzie funkcja próbuje przydzielić dwa bloki pamięci i zgłasza wyjątek w przypadku niepowodzenia alokacji:
{ 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); }
Jeśli pierwsza alokacja nie powiedzie się, możesz po prostu zgłosić wyjątek pamięci. Jeśli pierwsza alokacja zakończy się pomyślnie, ale druga zakończy się niepowodzeniem, należy zwolnić pierwszy blok alokacji przed zgłoszeniem wyjątku. Jeśli obie alokacje zakończą się powodzeniem, można kontynuować normalnie i zwolnić bloki podczas zamykania funkcji.
- Lub-
Użyj wyjątku zdefiniowanego przez użytkownika, aby wskazać warunek problemu. Jako wyjątek można zgłosić element dowolnego typu, nawet całą klasę.
Poniższy przykład próbuje odtworzyć dźwięk przez urządzenie falowe i zgłasza wyjątek, jeśli wystąpi awaria.
#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; }
Uwaga
Domyślna obsługa wyjątków MFC dotyczy tylko wskaźników do CException
obiektów (i obiektów CException
klas pochodnych). Powyższy przykład pomija mechanizm wyjątków MFC.