Freigeben über


Ausnahmen: Umwandeln von MFC-Ausnahmemakros

Dies ist ein erweitertes Thema.

In diesem Artikel wird erläutert, wie Sie vorhandenen Code konvertieren, der mit Microsoft Foundation-Klassenmakros geschrieben wurde – TRY, CATCH, THROW usw., um die C++-Ausnahmebehandlung Schlüsselwort (keyword)s try, catchund throw. Dabei werden folgende Themen behandelt:

Vorteile der Konvertierung

Wahrscheinlich müssen Sie vorhandenen Code nicht konvertieren, obwohl Sie sich die Unterschiede zwischen den Makroimplementierungen in MFC Version 3.0 und den Implementierungen in früheren Versionen bewusst sein sollten. Diese Unterschiede und nachfolgende Änderungen im Codeverhalten werden in Ausnahmen erläutert: Änderungen an Ausnahmemakros in Version 3.0.

Die wichtigsten Vorteile der Konvertierung sind:

  • Code, der die C++-Ausnahmebehandlung verwendet, Schlüsselwort (keyword)s kompiliert zu einer etwas kleineren EXE- oder .DLL-Datei.

  • Die C++-Ausnahmebehandlung Schlüsselwort (keyword)s ist vielseitiger: Sie können Ausnahmen von jedem Datentyp verarbeiten, der kopiert werden kann (int, float, charusw.), während die Makros ausnahmen nur von Klassen CException und Klassen verarbeiten, die daraus abgeleitet werden.

Der Hauptunterschied zwischen den Makros und den Schlüsselwort (keyword) besteht darin, dass Code mit den Makros "automatisch" eine abgefangene Ausnahme löscht, wenn die Ausnahme außerhalb des Gültigkeitsbereichs liegt. Code, der die Schlüsselwort (keyword)s verwendet, ist nicht der Fall, sodass Sie eine abgefangene Ausnahme explizit löschen müssen. Weitere Informationen finden Sie im Artikel Ausnahmen: Abfangen und Löschen von Ausnahmen.

Ein weiterer Unterschied besteht in der Syntax. Die Syntax für Makros und Schlüsselwort (keyword) unterscheidet sich in drei Punkten:

  1. Makroargumente und Ausnahmedeklarationen:

    Ein CATCH-Makroaufruf weist die folgende Syntax auf:

    CATCH(exception_class, exception_object_pointer_name)

    Beachten Sie das Komma zwischen dem Klassennamen und dem Objektzeigernamen.

    Die Ausnahmedeklaration für die catch Schlüsselwort (keyword) verwendet folgende Syntax:

    catch(exception_typeexception_name)

    Diese Ausnahmedeklarationsanweisung gibt den Typ der Ausnahme an, die der Catch-Block-Handles behandelt.

  2. Trennzeichen von Catch-Blöcken:

    Bei den Makros beginnt das CATCH-Makro (mit seinen Argumenten) den ersten Catch-Block. Das AND_CATCH Makro beginnt nachfolgende Catch-Blöcke, und das END_CATCH Makro beendet die Abfolge von Abfangblöcken.

    Mit den Schlüsselwort (keyword)s beginnt der catch Schlüsselwort (keyword) (mit seiner Ausnahmedeklaration) jeden Catch-Block. Es gibt kein Gegenstück zum END_CATCH Makro. Der Catch-Block endet mit seiner schließenden geschweiften Klammer.

  3. Der Auslösenausdruck:

    Die Makros verwenden THROW_LAST , um die aktuelle Ausnahme erneut auszuwerfen. Die throw Schlüsselwort (keyword) hat ohne Argument die gleiche Wirkung.

Ausführen der Konvertierung

So konvertieren Sie Code mithilfe von Makros zur Verwendung der C++-Ausnahmebehandlung Schlüsselwort (keyword)

  1. Suchen Sie alle Vorkommen der MFC-Makros TRY, CATCH, AND_CATCH, END_CATCH, THROW und THROW_LAST.

  2. Ersetzen oder löschen Sie alle Vorkommen der folgenden Makros:

    TRY (Ersetzen sie durch try)

    CATCH (Ersetzen sie durch catch)

    AND_CATCH (Ersetzen durch catch)

    END_CATCH (löschen)

    THROW (Ersetzen durch throw)

    THROW_LAST (Ersetzen durchthrow)

  3. Ändern Sie die Makroargumente so, dass sie gültige Ausnahmedeklarationen bilden.

    Ändern Sie zum Beispiel

    CATCH(CException, e)
    

    Bis

    catch (CException* e)
    
  4. Ändern Sie den Code in den Catch-Blöcken so, dass er Ausnahmeobjekte nach Bedarf löscht. Weitere Informationen finden Sie im Artikel Ausnahmen: Abfangen und Löschen von Ausnahmen.

Nachfolgend sehen Sie ein Beispiel für Den Ausnahmebehandlungscode mithilfe von MFC-Ausnahmemakros. Beachten Sie, dass die Ausnahme e automatisch gelöscht wird, da der Code im folgenden Beispiel die Makros verwendet:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

Der Code im nächsten Beispiel verwendet die C++-Ausnahme Schlüsselwort (keyword)s, sodass die Ausnahme explizit gelöscht werden muss:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch (CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

Weitere Informationen finden Sie unter Ausnahmen: Verwenden von MFC-Makros und C++-Ausnahmen.

Siehe auch

Ausnahmebehandlung