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 и базами данных.
Класс CException
Класс CException включает два виртуальных метода GetErrorMessage и ReportError. Эти методы позволяют получить словесное описание причины, которая привела к вызову исключения. Заметим, что методы GetErrorMessage и ReportError чисто виртуальные, поэтому они должны быть переопределены в наследуемом классе:
virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);
Когда вы вызываете в обработчике исключения метод GetErrorMessage, он записывает в буфер lpszError сообщение об ошибке, вызвовшей исключение. Размер буфера надо указать в параметре nMaxError. В конце сообщения всегда записывается символ двоичного нуля. Если сообщение не помещается в буфер lpszError (оно больше чем nMaxError – 1 байт), тогда в буфер записываются только nMaxError – 1 символов сообщения. В последний байт записывается двоичный нуль.
Необязательный параметр pnHelpContext может содержать указатель на переменную типа UINT, в которую будет записан идентификатор контекстной подсказки (help context ID).