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 и базами данных.

<p>Класс CException</p>

Класс 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).

Перейти на страницу:

Все книги серии Библиотека системного программиста

Похожие книги