Udostępnij za pośrednictwem


Wyjątki: używanie makr MFC i wyjątków języka C++

W tym artykule omówiono zagadnienia dotyczące pisania kodu, który wykorzystuje zarówno makra obsługi wyjątków MFC i słów kluczowych języka C++ obsługi wyjątków.

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

  • Mieszanie wyjątek słów kluczowych i makra

  • Bloki catch bloków try wewnątrz

Mieszanie wyjątek słów kluczowych i makra

Można mieszać makra wyjątek MFC i słów kluczowych wyjątek języka C++ w tym samym programie.Jednak nie można mieszać makra MFC słów kluczowych wyjątek C++ w tym samym bloku, ponieważ makra obiektów exception automatycznie usuwać chwilą wykroczenia poza zakres, dlatego kod przy użyciu słów kluczowych obsługi wyjątków, nie.Aby uzyskać więcej informacji, zobacz artykuł wyjątki: wyjątków połowu i usuwania.

Główną różnicą między makra i słowa kluczowe jest, że te makra usuwają "automatycznie" wykrył wyjątek podczas wyjątek wykracza poza zakres.Kod przy użyciu słów kluczowych, nie; wyjątki przechwytywane w bloku catch musi być jawnie usunięty.Mieszania makra i słów kluczowych języka C++ wyjątek mogą być przyczyną przecieków pamięci, gdy obiekt wyjątku nie jest usuwane lub uszkodzenie sterty, gdy wyjątek zostanie usunięte dwa razy.

Na przykład, poniższy kod, unieważnia 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

Ten problem występuje, ponieważ e jest usuwane podczas wykonywania przechodzi obecnie "wewnętrzne" połowu bloku.Za pomocą THROW_LAST makro zamiast RZUCIĆ spowoduje, że instrukcja "zewn." 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

Spróbuj bloki wewnątrz bloki Catch

Nie można ponownie rzucić bieżącego wyjątek od wewnątrz Spróbuj bloku, który znajduje się wewnątrz połowu bloku.W poniższym przykładzie 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ści wyjątek.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC