Freigeben über


Ausnahmen: Verwenden von MFC-Makros und C++-Ausnahmen

In diesem Artikel werden Überlegungen zum Schreiben von Code, der die MFC-Ausnahmebehandlungsmakros und die C++-Ausnahmebehandlungsschlüsselworte verwendet.

Dieser Artikel enthält die folgenden Themen:

  • Mixingausnahmeschlüsselworte und Makros

  • Try-Blöcke innerhalb der catch-Blöcke

Mixing-Ausnahme-Schlüsselworte und Makros

Sie können MFC-Ausnahmemakros und C++-Ausnahme-Schlüsselworte im selben Programm kombinieren. Sie können jedoch mit C++-Ausnahme-Schlüsselworten MFC-Makros im gleichen Block nicht kombinieren, da die Makros Ausnahmeobjekte automatisch löschen, wenn sie den Gültigkeitsbereich verlassen, während Code mit der Ausnahmebehandlungsschlüsselworte hingegen nicht. Weitere Informationen finden Sie im Artikel Ausnahmen: Ausnahmen abfangen und Löschen.

Der Hauptunterschied zwischen Makros und den Schlüsselwörtern ist, dass die Makros "automatisch" eine abgefangene Ausnahme löschen, wenn die Ausnahme den Bereich verlässt. Code mit der Schlüsselwörter jedoch nicht; die Ausnahmen, die in einem catch-Block abgefangen wurden, müssen explizit gelöscht werden. Mixingmakros und C++-Ausnahme-Schlüsselworte können Speicherverluste, wenn ein Ausnahmeobjekt nicht gelöscht wird, oder auf Beschädigungen verursachen, wenn eine Ausnahme zweimal gelöscht wird.

Im folgenden Code z macht den Ausnahmezeiger ungültig:

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

Das Problem tritt auf, da e gelöscht wird, wenn die Ausführung des inneren" CATCH "Block abgeschlossen ist. Verwenden des Makros THROW_LAST anstelle der THROW-Anweisung bewirkt den äußeren" CATCH "Block, einen gültigen Zeiger zu erhalten:

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

Try-Blöcke innerhalb der Blöcke

Sie können die aktuelle Ausnahme nicht aus einem try-Block erneut auslösen, der innerhalb eines Blocks CATCH ist. Im folgenden Beispiel ist NULL:

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

Weitere Informationen finden Sie unter Ausnahmen: Untersuchungsausnahme-Inhalt.

Siehe auch

Konzepte

Ausnahmebehandlung in MFC