Freigeben über


Ausnahmen: Konvertieren 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 Schlüsselwörter tryfür die C++-Ausnahmebehandlung zu verwenden, 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++-Schlüsselwörter für die Ausnahmebehandlung verwendet, wird zu einem etwas kleineren .EXE oder .DLL kompiliert.

  • Die Schlüsselwörter für die C++-Ausnahmebehandlung sind 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üsselwörtern 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üsselwörter 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üsselwörter 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 das catch Schlüsselwort 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 Catch-Blöcken.

    Bei den Schlüsselwörtern beginnt das catch Schlüsselwort (mit seiner Ausnahmedeklaration) mit jedem Catch-Block. Es gibt kein Gegenstück zum END_CATCH Makro; der Fangblock endet mit seiner schließende geschweifte Klammer.

  3. Der Auslösenausdruck:

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

Ausführen der Konvertierung

So konvertieren Sie Code mithilfe von Makros, um die Schlüsselwörter für die C++-Ausnahmebehandlung zu verwenden

  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 durch throw)

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

    Ändern Sie zum Beispiel

    CATCH(CException, e)
    

    zu

    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++-Ausnahmestichwörter, 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