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


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

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

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

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

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

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

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

См. также

Обработка исключений