Freigeben über


Ausnahmen: Konvertieren von den MFC-Ausnahme-Makros

Dies ist ein erweitertes Thema.

In diesem Artikel wird beschrieben, wie Sie den vorhandenen Code konvertiert, der mit Microsoft Foundation Class-Makros geschrieben wird, TRY, CATCH, THROW usw. — Schlüsselwörter try, die C++-Ausnahmebehandlungs catch und throw zu verwenden.Folgende Themen werden behandelt:

  • Vorteile Konvertierung

  • Code mit Ausnahme von Makros zum Konvertieren von C++-Ausnahmen zu verwenden

Vorteile der Konvertierung

Sie müssen keine vorhandenen Code zu konvertieren, obwohl Sie Unterschiede zwischen den Makro in Implementierungen MFC-Version 3.0 und den Implementierungen in früheren Versionen kennen sollten.Diese Unterschiede und weiteren Änderungen im Code Verhalten werden in Ausnahmen: Änderungen an den Ausnahme-Makros in Version 3.0 erläutert.

Die wichtigsten Vorteile der Konvertierung sind:

  • Code, der die C++-Ausnahmebehandlungs Schlüsselwörter verwendet, kompiliert einige einem kleineren EXE- oder einem .DLL.

  • Die C++-Ausnahmebehandlungs Schlüsselwörter sind vielseitiger: Sie können jeden Datentyps Ausnahmen behandeln, die kopiert werden können (int, float, char usw.), während die Makros Ausnahmen nur der Klasse CException und Klassen, die davon abgeleitet wurden behandeln.

Der Hauptunterschied zwischen den Makros und den Schlüsselwörtern besteht darin, dass Code mit der Bezeichnung "Automatically Makros" eine abgefangene Ausnahme gelöscht werden, wenn sie den Bereich verlässt.Code mithilfe der Schlüsselwörter jedoch nicht. Daher müssen Sie eine abgefangene Ausnahme explizit löschen.Weitere Informationen finden Sie im Artikel Ausnahmen: Ausnahmen abfangen und Löschen.

Ein weiterer Unterschied ist Syntax.Die Syntax für Makros und Schlüsselwörter unterscheidet sich in drei Respekt:

  1. Makro Deklarationen Ausnahme und Argumente:

    Ein CATCH Makroaufruf hat folgende Syntax:

    CATCH(exception_class, exception_object_pointer_name)

    Beachten Sie das Komma zwischen dem Klassennamen und dem angegebenen Objektzeiger unter Coclass.

    Die Ausnahme catch-Deklaration für das Schlüsselwort verwendet diese Syntax:

    catch(exception_typeexception_name)

    Diese Ausnahmedeklarationsanweisung gibt den Typ der Ausnahme die catch-Blocks-Handles an.

  2. Begrenzung von catch-Blöcken:

    Arbeiten mit Makros ( CATCH wird das Makro mit den Argumenten) den ersten Catch-Block. AND_CATCH nachfolgende catch-Blöcke das Makro beginnt und das END_CATCH Makro beendet die Sequenz von catch-Blöcken.

    Bei den Schlüsselwörtern wird das catch-Schlüsselwort (mit Ausnahme der Deklaration) jeder catch-Block.Es gibt keine Entsprechung zum END_CATCH Makro. catch-Blocks-Enden die mit der schließenden Klammer.

  3. Der Ausdruck Wurfs:

    Die Makros verwenden THROW_LAST, um die aktuelle Ausnahme erneut ausgelöst.Das Schlüsselwort, ohne Argument throw hat den gleichen Effekt.

Hierdurch der Konvertierung

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

  1. Suchen Sie alle Vorkommen von 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 sie durch try)

    CATCH (ersetzen Sie sie durch catch)

    AND_CATCH (ersetzen Sie sie durch catch)

    Es END_CATCH (Löschen)

    THROW (ersetzen Sie sie durch throw)

    THROW_LAST (ersetzen Sie sie durch throw)

  3. Ändern Sie die bestehenden, sodass sie gültige Ausnahme Deklarationen besteht.

    Beispielsweise Änderung

    CATCH(CException, e)
    

    zu

    catch(CException* e)
    
  4. Ändern Sie den Code in catch-Blöcken, damit er bei Bedarf Ausnahmeobjekte gelöscht wird.Weitere Informationen finden Sie im Artikel Ausnahmen: Ausnahmen abfangen und Löschen.

Es folgt ein Beispiel für den Code zur Ausnahmebehandlung mit der MFC-Ausnahme von Makros.Da der Code im folgenden Beispiel die Makros verwendet e die Ausnahme automatisch gelöscht wird:

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 folgenden Beispiel verwendet die C++-Ausnahme-Schlüsselworte. Daher muss die Ausnahme explizit gelöscht werden:

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

Konzepte

Ausnahmebehandlung in MFC