Ausnahmen: Auslösen von Ausnahmen von eigenen Funktionen

Es ist möglich, das MFC-Ausnahmebehandlungs paradigma nur zu verwenden, um Ausnahmen abzufangen, die von Funktionen in MFC oder in anderen Bibliotheken ausgelöst werden.Zusätzlich zum Abfangen von Ausnahmen, die von Bibliothekscode Ausnahmen ausgelöst werden, können Sie von Ihrem Code auslösen, wenn Sie Funktionen schreiben die Ausnahme Bedingungen treffen können.

Wenn eine Ausnahme ausgelöst wird, wird die Ausführung der aktuellen Funktion beendet und springt direkt an den catch Skinframes Block der inneren Ausnahme.Der Mechanismus zur Ausnahme umgeht den normalen Pfad Beenden von einer Funktion.Daher müssen Sie sicher sein, diese Speicherblöcke zu löschen, die in einer normalen Beendigung gelöscht werden.

Um eine Ausnahme auslösen

  1. Verwenden Sie eine der MFC-Hilfsfunktionen, wie AfxThrowMemoryException.Diese Funktionen lösen ein zugeteiltes Ausnahmeobjekt des entsprechenden Typs aus.

    Im folgenden Beispiel wird eine Funktion mit zwei Speicherblöcke reservieren und löst eine Ausnahme aus, wenn eine Reservierung einen Fehler verursacht:

    {
        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 Belegung fehlschlägt, können Sie den Speicher ausnahme einfach auslösen.Bei der ersten Zuordnung erfolgreich ist, aber zweite fehlschlägt, müssen Sie den ersten Zuordnungsblock freigeben, bevor Sie die Ausnahme auslösen.Wenn beide Zuordnungen können Sie normalerweise fortfahren und die Blöcke freigeben, wenn Sie die Funktion beenden.

     – oder – 

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

    Im folgenden Beispiel wird versucht, einen Sound abgespielt Wellen durch ein, 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;
    }
    
HinweisHinweis

MFC verwendet Behandlung von Ausnahmen nur für Zeiger auf CException-Objekten fest (und Objekten von CException abgeleitete Klassen).Im oben stehenden Beispiel werden von MFC Mechanismus für die Ausnahme.

Siehe auch

Konzepte

Ausnahmebehandlung in MFC