Share via


Ausnahmen: Ausnahmen in eigenen Funktionen auslösen

Es ist möglich, das MFC-Ausnahmebehandlungsparadigma ausschließlich zum Abfangen von Ausnahmen zu verwenden, die von Funktionen in MFC oder anderen Bibliotheken ausgelöst werden. Zusätzlich zum Abfangen von Ausnahmen, die vom Bibliothekscode ausgelöst werden, können Sie Ausnahmen von Ihrem eigenen Code auslösen, wenn Sie Funktionen schreiben, die auf außergewöhnliche Bedingungen stoßen können.

Wenn eine Ausnahme ausgelöst wird, wird die Ausführung der aktuellen Funktion beendet und springt direkt zum catch Block des innersten Ausnahmeframes. Mit dem Ausnahmemechanismus wird der normale Ausgangspfad einer Funktion umgangen. Daher müssen Sie unbedingt diese Speicherblöcke löschen, die in einem normalen Beenden gelöscht werden.

So lösen Sie eine Ausnahme aus

  1. Verwenden Sie eine der MFC-Hilfsfunktionen, z AfxThrowMemoryException. B. . Diese Funktionen lösen ein vorab zugewiesenes Ausnahmeobjekt des entsprechenden Typs aus.

    Im folgenden Beispiel versucht eine Funktion, zwei Speicherblöcke zuzuweisen, und löst eine Ausnahme aus, wenn eine der beiden Zuordnungen fehlschlägt:

    {
    char* p1 = (char*)malloc(SIZE_FIRST);
    if (p1 == NULL)
    AfxThrowMemoryException();
    char* p2 = (char*)malloc(SIZE_SECOND);
    if (p2 == NULL)
    {
       free(p1);
       AfxThrowMemoryException();
    }
    
    // ... Do something with allocated blocks ...
    
    // In normal exit, both blocks are deleted.
    free(p1);
    free(p2);
    }
    

    Wenn die erste Zuordnung fehlschlägt, können Sie einfach die Speicher ausnahme auslösen. Wenn die erste Zuordnung erfolgreich ist, das zweite jedoch fehlschlägt, müssen Sie den ersten Zuordnungsblock freigeben, bevor Sie die Ausnahme auslösen. Wenn beide Zuordnungen erfolgreich sind, können Sie normal fortfahren und die Blöcke beim Beenden der Funktion freigeben.

    • ODER
  2. Verwenden Sie eine benutzerdefinierte Ausnahme, um eine Problembedingung anzugeben. Sie können ein Element eines beliebigen Typs, sogar eine ganze Klasse, als Ausnahme auslösen.

    Im folgenden Beispiel wird versucht, einen Sound über ein Wellengerät wiederzugeben, und löst eine Ausnahme aus, wenn ein Fehler auftritt.

    #define WAVE_ERROR -5
       {
       // This Win32 API returns 0 if the sound cannot be played.
       // Throw an integer constant if it fails.
       if (!PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC))
          throw WAVE_ERROR;
       }
    

Hinweis

Die Standardbehandlung von Ausnahmen von MFC gilt nur für Zeiger auf CException Objekte (und Objekte von CExceptionabgeleiteten Klassen). Im obigen Beispiel wird der Ausnahmemechanismus von MFC umgangen.

Siehe auch

Ausnahmebehandlung