Исключения: Генерация исключений из собственных функций
Можно использовать парадигму обработки ошибок MFC исключительно для перехвата исключений, формируемых функциями в MFC или других библиотеках.В дополнение к вызову исключения заразительным код библиотеки можно вызвать исключения из собственного кода при создании функции, которые могут возникнуть исключительнейшие условия.
При возникновении исключения, выполнение текущей функции остановлен и скачет непосредственно к блоку catch самого внутреннего кадра исключения.Исключение обходит механизм нормальный путь выйти из функции.Поэтому необходимо быть уверенным удалять эти блоки памяти, которые будут удалены в обычном оставить.
Создать исключение
Используйте одну из функций поддержки MFC, как AfxThrowMemoryException.Эти функции создают предварительно объект исключения, соответствующего типа.
В следующем примере функция пытается выбрать 2 блоков памяти и генерирует исключение, если любое выделение памяти завершается неудачей.
{ 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 ); }
Если первое выделение завершается ошибкой, можно просто создавать исключение памяти.Если первое выделение успешно, а второй не удалась, необходимо освободить первый блок памяти до создания исключения.Если оба распределения выполняются успешно, то можно продолжать нормально и освобождения блоков оставить функция.
– или –
Используйте определяемое пользователем исключения, чтобы указать условие проблемы.Можно создать элемент любого типа, даже всего класса, как ваше исключение.
В следующем примере пытается воспроизведения звука из звукового устройство и генерирует исключение, если сбой.
#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; }
![]() |
---|
MFC имеют значение по умолчанию обработка исключений применяются только к указателям на объекты CException (и объектов CException- производным классам).В приведенном выше примере обходит механизм исключения MFC. |