Поделиться через


Исключения. Создание исключений из собственных функций

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

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

Исключения

  1. Используйте одну из вспомогательных функций MFC, например AfxThrowMemoryException. Эти функции создают preallocated объект исключения соответствующего типа.

    В следующем примере функция пытается выделить 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