Udostępnij za pośrednictwem


Wyjątki: Za pomocą makra MFC i wyjątki C++

W tym artykule omówiono zagadnienia dotyczące pisania kodu, który używa zarówno makra obsługi wyjątków MFC i słowa kluczowe obsługi wyjątków C++.

W tym artykule omówiono następujące tematy:

  • Mieszanie wyjątek słowa kluczowe i makra

  • Bloki catch bloków try wewnątrz

Mieszanie wyjątek słowa kluczowe i makra

Można łączyć makra wyjątek MFC i słowa kluczowe wyjątek C++, w tym samym programie.Jednak ponieważ makra usunąć wyjątek obiekty automatycznie kiedy wykraczają poza zakresem kodu za pomocą słów kluczowych obsługa wyjątków może nie nie można mieszać MFC makr za pomocą słów kluczowych wyjątek C++, w tym samym bloku.Aby uzyskać więcej informacji, zobacz artykuł wyjątki: połowu i usuwanie wyjątki.

Główna różnica pomiędzy makra i słowa kluczowe jest makra "automatycznie" Usuń wykrył wyjątek podczas wyjątek wykracza poza zakres.Kod przy użyciu słów kluczowych nie; wyjątki w bloku catch musi być jawnie usunięty.Mieszanie makra i słowa kluczowe wyjątek C++ można spowodować przecieki pamięci, gdy obiekt wyjątku nie jest usuwany lub uszkodzenie sterty, gdy wyjątek zostanie usunięty dwa razy.

Na przykład, następujący kod powoduje unieważnienie wskaźnik wyjątek:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      throw;  // Invalid attempt to throw exception
            // to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is invalid because
    // it was deleted in the inner catch block.
}
END_CATCH

Problem występuje, ponieważ e jest usuwany, gdy wykonanie przechodzi z "wewnętrzną" połowu bloku.Za pomocą THROW_LAST makro zamiast THROW instrukcja spowoduje, że "zewnętrzne" połowu bloku do otrzymania prawidłowego wskaźnika:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      THROW_LAST(); // Throw exception to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is valid because
    // THROW_LAST() was used.
}
END_CATCH

Bloki Catch wewnątrz bloków try

Nie można ponowne bieżącego wyjątku z poziomu Spróbuj blok wewnątrz połowu bloku.Poniższy przykład jest nieprawidłowy:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   try
   {
      throw;  // Wrong.  Causes e (the exception 
            // being thrown) to be deleted.
   }
   catch(CException* exception)
   {
      exception->ReportError();
   }
}
END_CATCH

Aby uzyskać więcej informacji, zobacz wyjątki: badanie zawartość wyjątek.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC