Udostępnij za pośrednictwem


Wyjątki: Generowania wyjątków od własnych funkcji

Jest możliwe wykorzystanie paradygmat obsługi wyjątków MFC wyłącznie do połowu wyjątki generowane przez funkcje MFC lub inne biblioteki.Oprócz połowu wyjątki generowane przez kod biblioteki, można generują wyjątki od własnego kodu podczas pisania, funkcje, które można napotkać wyjątkowych warunków.

Gdy wyjątek jest generowany, wykonanie bieżącej funkcji jest zatrzymana i przechodzi bezpośrednio do połowu bloku ramkę polem wewnętrznym wyjątku.Mechanizm wyjątek pomija ścieżki wyjścia normalne w funkcji.Dlatego należy upewnić się, że usuwanie tych bloków pamięci usunięte w normalnym wyjścia.

Zgłaszanie wyjątku

  1. Użyj jednej z funkcji pomocnika MFC, takich jak AfxThrowMemoryException.Te funkcje generują obiekt wyjątku przydzielonych wstępnie odpowiedniego typu.

    W poniższym przykładzie funkcja próbuje przydzielić dwa bloki pamięci i zgłasza wyjątek, jeśli ulegnie awarii albo 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żna po prostu Zgłoś wyjątek pamięci.Jeśli pierwsza alokacja jest udane, ale nie drugiej, należy zwolnić pierwszy blok przydziału przed wyrzuceniem wyjątek.Jeśli uda się zarówno alokacje, można normalnie kontynuować i wolnych bloków podczas zamykania funkcji.

     – lub – 

  2. Umożliwia wskazanie warunek problem wyjątków zdefiniowanej przez użytkownika.Za throw element dowolnego typu, a nawet całe klasy, jak ten wyjątek.

    W poniższym przykładzie próbuje odtworzyć dźwięk za pomocą urządzenia wave 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]

MFC firmy domyślna obsługa wyjątków dotyczy tylko wskaźników do CException obiektów (i obiekty CException-klasy pochodne).W powyższym przykładzie pomija mechanizm wyjątek MFC firmy.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC