Udostępnij za pośrednictwem


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

  1. 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-
  2. 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 CExceptionklas pochodnych). Powyższy przykład pomija mechanizm wyjątków MFC.

Zobacz też

Obsługa wyjątków