Share via


Ausnahmen: Abfangen und Löschen von Ausnahmen

In den folgenden Anweisungen und Beispielen wird gezeigt, wie Ausnahmen erfasst und gelöscht werden. Weitere Informationen zu den , und Schlüsselwort (keyword)s finden Sie unter Modern C++ bewährte Methoden für Ausnahmen und Fehlerbehandlung.throwcatchtry

Ihre Ausnahmehandler müssen Ausnahmeobjekte löschen, die behandelt werden, da beim Löschen der Ausnahme ein Speicherverlust auftritt, wenn dieser Code eine Ausnahme abfangen kann.

Ihr catch Block muss eine Ausnahme löschen, wenn:

  • Der catch Block löst eine neue Ausnahme aus.

    Natürlich dürfen Sie die Ausnahme nicht löschen, wenn Sie dieselbe Ausnahme erneut auslösen:

    catch (CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else
          e->Delete();
    }
    
  • Die Ausführung wird aus dem catch Block zurückgegeben.

Hinweis

Verwenden Sie beim Löschen eines Elements CExceptiondie Delete Memberfunktion, um die Ausnahme zu löschen. Verwenden Sie die delete Schlüsselwort (keyword) nicht, da sie fehlschlagen kann, wenn sich die Ausnahme nicht auf dem Heap befindet.

So erfassen und löschen Sie Ausnahmen

  1. Verwenden Sie die try Schlüsselwort (keyword), um einen try Block einzurichten. Führen Sie alle Programmanweisungen aus, die eine Ausnahme innerhalb eines try Blocks auslösen können.

    Verwenden Sie die catch Schlüsselwort (keyword), um einen catch Block einzurichten. Platzieren Sie Ausnahmebehandlungscode in einem catch Block. Der Code im catch Block wird nur ausgeführt, wenn der Code innerhalb des try Blocks eine Ausnahme des in der catch Anweisung angegebenen Typs auslöst.

    Die folgende Skelett zeigt, wie try und catch Blöcke normalerweise angeordnet sind:

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch (CException* e)
    {
       // Handle the exception here.
       // "e" contains information about the exception.
       e->Delete();
    }
    

    Wenn eine Ausnahme ausgelöst wird, wird das Steuerelement an den ersten catch Block übergeben, dessen Ausnahmedeklaration mit dem Typ der Ausnahme übereinstimmt. Sie können verschiedene Arten von Ausnahmen selektiv mit sequenziellen catch Blöcken behandeln, wie unten aufgeführt:

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch (CMemoryException* e)
    {
       // Handle the out-of-memory exception here.
       e->Delete();
    }
    catch (CFileException* e)
    {
       // Handle the file exceptions here.
       e->Delete();
    }
    catch (CException* e)
    {
       // Handle all other types of exceptions here.
       e->Delete();
    }
    

Weitere Informationen finden Sie unter Ausnahmen: Konvertieren von MFC-Ausnahmemakros.

Siehe auch

Ausnahmebehandlung