Обработка исключений в MFC
В этой статье описываются механизмы обработки исключений, доступные в MFC. Доступны два механизма:
Исключения C++, доступные в MFC версии 3.0 и более поздних версиях
Макросы исключений MFC, доступные в MFC версии 1.0 и более поздних версиях
Если вы пишете новое приложение с помощью MFC, следует использовать механизм C++. Механизм на основе макросов можно использовать, если существующее приложение уже использует этот механизм.
Вы можете легко преобразовать существующий код для использования исключений C++ вместо макросов исключений MFC. Преимущества преобразования кода и рекомендаций для этого описаны в статье исключения: преобразование из макросов исключений MFC.
Если вы уже разработали приложение с помощью макросов исключений MFC, вы можете продолжать использовать эти макросы в существующем коде, используя исключения C++ в новом коде. Исключения из статьи : Изменения макросов исключений в версии 3.0 содержат рекомендации по этому вопросу.
Примечание.
Чтобы включить обработку исключений C++ в коде, выберите включить исключения C++ на странице создания кода в папке C/C++ диалогового окна "Страницы свойств проекта" или используйте параметр компилятора /EHsc.
В этой статье рассматриваются следующие темы:
Использование исключений
Три категории результатов могут возникать при вызове функции во время выполнения программы: обычное выполнение, ошибочное выполнение или ненормальное выполнение. Каждая категория описана ниже.
Обычное выполнение
Функция может выполняться нормально и возвращать. Некоторые функции возвращают код результата вызывающему объекту, который указывает на результат функции. Возможные коды результатов строго определены для функции и представляют диапазон возможных результатов функции. Код результата может указывать на успех или сбой или даже может указывать конкретный тип сбоя, который находится в обычном диапазоне ожиданий. Например, функция состояния файла может возвращать код, указывающий, что файл не существует. Обратите внимание, что термин "код ошибки" не используется, так как результирующий код представляет собой один из многих ожидаемых результатов.
Ошибочное выполнение
Вызывающий объект делает некоторую ошибку при передаче аргументов в функцию или вызывает функцию в неуместном контексте. Эта ситуация вызывает ошибку, и она должна быть обнаружена утверждением во время разработки программы. (Дополнительные сведения о утверждениях см. в разделе Утверждения C/C++.)
Ненормальное выполнение
Ненормальное выполнение включает ситуации, когда условия, не связанные с контролем программы, например с низкой памятью или ошибками ввода-вывода, влияют на результат функции. Ненормальные ситуации должны обрабатываться путем перехвата и возникновения исключений.
Использование исключений особенно подходит для ненормального выполнения.
Поддержка исключений MFC
Независимо от того, используете ли вы исключения C++ непосредственно или используете макросы исключений MFC, вы будете использовать класс CException или CException
производные объекты, которые могут быть вызваны платформой или приложением.
В следующей таблице показаны предопределенные исключения, предоставляемые MFC.
Exception - класс | Значение |
---|---|
Класс CMemoryException | Вне памяти |
Класс CFileException | Исключение файла |
Класс CArchiveException | Исключение архивации и сериализации |
Класс CNotSupportedException | Ответ на запрос неподдерживаемой службы |
Класс CResourceException | Исключение выделения ресурсов Windows |
Класс CDaoException | Исключения базы данных (классы DAO) |
Класс CDBException | Исключения базы данных (классы ODBC) |
Класс COleException | исключения OLE |
Класс COleDispatchException | Исключения диспетчеризации (автоматизации) |
Класс CUserException | Исключение, которое оповещает пользователя с полем сообщения, а затем создает универсальный класс CException |
Начиная с версии 3.0, MFC использует исключения C++, но по-прежнему поддерживает более старые макросы обработки исключений, которые по форме схожи с исключениями C++. Хотя эти макросы не рекомендуется использовать в новом программировании, они по-прежнему поддерживаются для обеспечения обратной совместимости. В программах, в которых уже используются макросы, можно также свободно использовать исключения C++. Во время предварительной обработки макросы оценивают обработку исключений ключевое слово, определенных в реализации MSVC языка C++ на языке Visual C++ версии 2.0. Начиная работать с исключениями C++, разработчик может оставить существующие макросы исключений. Сведения о сочетании макросов и обработке исключений C++ и преобразовании старого кода для использования нового механизма см. в статьях " Исключения: Использование макросов MFC и исключений C++ и исключений: преобразование из макросов исключений MFC. Более ранние макросы исключений MFC, если вы их еще используете, возвращают ключевые слова исключений C++. См . исключения: изменения макросов исключений в версии 3.0. MFC не поддерживает напрямую структурированные обработчики исключений Windows NT ( SEH), как описано в разделе "Обработка структурированных исключений".
Дополнительные сведения об исключениях
В следующих статьях объясняется использование библиотеки MFC для передачи исключений:
В следующих статьях сравниваются макросы исключений MFC с ключевое слово исключения C++ и объясняется, как адаптировать код:
См. также
Современные рекомендации по C++ по исключению и обработке ошибок