Udostępnij za pośrednictwem


Wyjątki: przechwytywanie i usuwanie wyjątków

Poniższe instrukcje i przykłady pokazują, jak przechwytywać i usuwać wyjątki. Aby uzyskać więcej informacji na trytemat słów kluczowych , catchi throw , zobacz Nowoczesne najlepsze rozwiązania języka C++ dotyczące wyjątków i obsługi błędów.

Programy obsługi wyjątków muszą usuwać obsługiwane przez nie obiekty wyjątków, ponieważ błąd usunięcia wyjątku powoduje przeciek pamięci za każdym razem, gdy kod przechwytuje wyjątek.

Blok catch musi usunąć wyjątek, gdy:

  • Blok catch zgłasza nowy wyjątek.

    Oczywiście nie można usunąć wyjątku, jeśli ponownie zgłosisz ten sam wyjątek:

    catch (CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else
          e->Delete();
    }
    
  • Wykonanie jest zwracane z bloku catch .

Uwaga

Podczas CExceptionusuwania elementu użyj funkcji składowej Delete , aby usunąć wyjątek. Nie używaj słowa kluczowego delete , ponieważ może zakończyć się niepowodzeniem, jeśli wyjątek nie znajduje się na stercie.

Aby przechwycić i usunąć wyjątki

  1. Użyj słowa kluczowego try try , aby skonfigurować blok. Wykonaj wszystkie instrukcje programu, które mogą zgłaszać wyjątek w try bloku.

    Użyj słowa kluczowego catch catch , aby skonfigurować blok. Umieść kod obsługi wyjątków w catch bloku. Kod w catch bloku jest wykonywany tylko wtedy, gdy kod w try bloku zgłasza wyjątek typu określonego w instrukcji catch .

    Poniższy szkielet pokazuje, jak try i catch bloki są zwykle rozmieszczone:

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch (CException* e)
    {
       // Handle the exception here.
       // "e" contains information about the exception.
       e->Delete();
    }
    

    Gdy zgłaszany jest wyjątek, kontrolka przechodzi do pierwszego catch bloku, którego deklaracja wyjątku jest zgodna z typem wyjątku. Można selektywnie obsługiwać różne typy wyjątków z blokami sekwencyjnymi catch , jak pokazano poniżej:

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch (CMemoryException* e)
    {
       // Handle the out-of-memory exception here.
       e->Delete();
    }
    catch (CFileException* e)
    {
       // Handle the file exceptions here.
       e->Delete();
    }
    catch (CException* e)
    {
       // Handle all other types of exceptions here.
       e->Delete();
    }
    

Aby uzyskać więcej informacji, zobacz Wyjątki: konwertowanie z makr wyjątków MFC.

Zobacz też

Obsługa wyjątków