Wyjątki: zgłaszanie wyjątków z własnych funkcji

To można użyć wyłącznie do połowu wyjątki generowane przez funkcje w MFC lub innych bibliotek MFC paradygmat obsługi wyjątków.Oprócz połowu wyjątki generowane przez kod biblioteki, można generują wyjątki z własnego kodu podczas pisania funkcje, które mogą wystąpić w wyjątkowych warunkach.

Gdy wygeneruje wyjątek wykonywania bieżącej funkcji jest zatrzymana, a następnie przechodzi bezpośrednio do połowu bloku ramki wewnętrzne wyjątek.Mechanizm wyjątek omija ścieżka normalnych wyjść z funkcją.W związku z tym należy usunąć te bloki pamięci, które zostałyby usunięte w normalnych wyjść.

Zgłoś wyjątek

  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 każda alokacja nie powiedzie się:

    {
        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łosić wyjątek pamięci.Jeśli pierwsza alokacja jest pomyślne, ale drugi nie powiedzie się, należy zwolnić pierwszy blok alokacji przed wyrzuceniem wyjątku.Jeśli uda się zarówno alokacje, można normalnie postępować i wolny bloki podczas zamykania funkcji.

     — lub — 

  2. Umożliwia wskazanie stanu problemu wyjątków zdefiniowanej przez użytkownika.Można rzucić element dowolnego typu, a nawet całą klasę, Twój wyjątku.

    W poniższym przykładzie próbuje odtworzyć dźwięk za pomocą urządzenia wave i zgłasza wyjątek, jeśli w przypadku awarii.

    #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 domyślna obsługa wyjątków ma zastosowanie tylko do wskaźników do CException obiektów (i obiekty CException-klasy pochodne).W powyższym przykładzie pomija mechanizm wyjątek MFC.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC