Ausnahmen: Ausnahmen in eigenen Funktionen auslösen
Es ist möglich, das MFC-Ausnahmebehandlungsparadigma nur zu verwenden, um Ausnahmen abzufangen, die von Funktionen in MFC oder anderen Bibliotheken ausgelöst werden. Neben den ob Ausnahmen, die durch Bibliothekscode ausgelöst werden, können Sie Ausnahmen aus dem eigenen Code auslösen, wenn Funktionen schreiben, die mit Bedingungen auftreten können.
Wenn eine Ausnahme ausgelöst wird, wird die Ausführung der aktuellen Funktion beendet und springt direkt zum catch-Block der innersten Ausnahmeframe. Der Ausnahmemechanismus umgeht den normalen Beendigungspfad einer Funktion. Daher müssen Sie sicherstellen, diese Speicherblöcke zu löschen, die in einer normalen Beendigung gelöscht werden.
Wenn Sie eine Ausnahme auslösen
Verwenden Sie eine der MFC-Hilfsfunktionen, wie AfxThrowMemoryException. Diese Funktionen lösen ein zugeteiltes Ausnahmeobjekt des entsprechenden Typs aus.
Im folgenden Beispiel versucht, eine Funktion zwei Speicherblöcken zuzuordnen und löst eine Ausnahme aus, wenn eine Zuordnung 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 die Arbeitsspeicherausnahme einfach auslösen. Wenn die erste Zuordnung erfolgreich ist, aber zweite fehlschlägt, müssen Sie dem ersten Zuordnungsblock freigeben, bevor die Ausnahme auslösen. Wenn beide Zuordnungen folgen, können Sie normalerweise fortfahren und Blöcken freigeben, wenn Sie die Funktion beenden.
– oder –
Verwenden Sie eine benutzerdefinierte Ausnahme, um einer Problemzustand anzugeben. Sie können ein Element eines beliebigen Typs, selbst eine ganze Klasse, als die Ausnahme auslösen.
Im folgenden Beispiel versucht, einen Sound von einem 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
Standardabwicklung MFC Ausnahmen gilt nur auf Zeiger zu CException-Objekten zu (und Objekten von CException abgeleitete Klassen).Die Ausnahmeder durch die Überbrückungen MFC des oben stehenden Beispiels.