Udostępnij przez


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 / Notatka

Podczas usuwania CException, użyj funkcji składowej Delete, aby usunąć wyjątek. Nie używaj słowa kluczowego delete, ponieważ może wystąpić problem, jeśli wyjątek nie znajduje się na stercie.

Aby przechwycić i usunąć wyjątki

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

    Użyj słowa kluczowego catch, aby skonfigurować blok catch. 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 także

Obsługa wyjątków