Исключения: Генерация исключений из собственных функций

Можно использовать парадигму обработки ошибок MFC исключительно для перехвата исключений, формируемых функциями в MFC или других библиотеках.В дополнение к вызову исключения заразительным код библиотеки можно вызвать исключения из собственного кода при создании функции, которые могут возникнуть исключительнейшие условия.

При возникновении исключения, выполнение текущей функции остановлен и скачет непосредственно к блоку catch самого внутреннего кадра исключения.Исключение обходит механизм нормальный путь выйти из функции.Поэтому необходимо быть уверенным удалять эти блоки памяти, которые будут удалены в обычном оставить.

Создать исключение

  1. Используйте одну из функций поддержки 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 );
    }
    

    Если первое выделение завершается ошибкой, можно просто создавать исключение памяти.Если первое выделение успешно, а второй не удалась, необходимо освободить первый блок памяти до создания исключения.Если оба распределения выполняются успешно, то можно продолжать нормально и освобождения блоков оставить функция.

     – или – 

  2. Используйте определяемое пользователем исключения, чтобы указать условие проблемы.Можно создать элемент любого типа, даже всего класса, как ваше исключение.

    В следующем примере пытается воспроизведения звука из звукового устройство и генерирует исключение, если сбой.

    #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.

См. также

Основные понятия

Обработка ошибок в MFC