Исключения – класс CException

Исключения – класс CException

Как мы рассказывали в главе “Обработка исключительных ситуаций”, язык Си++ позволяет вызывать и обрабатывать исключения любого типа. Однако эта возможность практически не используются классами, определенными в библиотеке MFC.

Для обработки исключительных ситуаций, возникающих в MFC, определен специальный класс. Сам класс CException является абстрактным классом. Объекты такого класса создавать нельзя. Для обработки исключительных ситуаций, возникающих в MFC, используется классы наследованные от класса CException:

CMemoryException      ?|?CException

CFileException        ?|

CArchiveException     ?|

CNotSupportedException?|

CResourceException    ?|

CDaoException         ?|

CDBException          ?|

COleException         ?|

COleDispatchException ?|

CUserException        ?|

Как правило, эти исключения вызываются методами классов MFC, когда возникают какие-либо ошибочные ситуации. Так, например, если вы попытаетесь открыть несуществующий файл, воспользовавшись для этого методом Open из класса CFile, то будет вызвано исключение CFileException.

Если вы желаете обрабатывать исключения, которые вызываются методами классов MFC, вы должны определить обработчики для этих исключений. Каждый такой обработчик должен представлять собой блок catch, в качестве аргумента которого надо использовать указатель на объект класса CException или указатель на объект класса, наследованного от класса CException:

try {

 // Здесь может находится код, который вызывает исключение

}

// Обработчик для исключения типа CMemoryException

catch(CMemoryException* ptrException) {

 // Обработка исключения …

 // В конце удаляем объект исключения

 ptrException–>Delete;

}

Еще раз подчеркнем, что обработчик исключений MFC должен принимать указатель на объект класса CException (или класса, наследованного от CException). Этот объект создается при возникновении исключительных ситуаций внутри методов MFC. После того как этот объект окажется не нужен, ваш обработчик должен его удалить. Для этого предназначен метод Delete, определенный в классе CException. Не используйте для удаления объектов класса CException и объектов классов, наследованных от него, обыкновенный оператор delete.

Обработчик исключения может выполнять различные действия в зависимости от того какое исключение и в каком контексте было вызвано. Для этого вы можете использовать методы и данные из объекта, переданного в обработчик исключения.

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

Класс Исключение вызывается CMemoryException При распределении оперативной памяти CFileException  При работе с файлами CArchiveException Во время записи или восстановления объектов (Archive/Serialization) CNotSupportedException При обращении к неизвестному методу, который не поддерживается данным классом CResourceException Ошибка при работе с ресурсами Windows CDaoException Ошибка при работе с базами данных, через средства DAO CDBException Ошибка при работе с базами данных, через средства ODBC COleException Ошибка при работе OLE COleDispatchException Ошибка при работе OLE CUserException При обработке этого исключения на экране отображается сообщение, а затем вызывается исключение CException

Сейчас мы не будем рассматривать исключения, связанные с технологией OLE и базами данных.