11
Обработка исключений
Базовым классом механизма обработки исключений служит класс CException. Этот класс (как и другие классы исключений) можно использовать для разработки своих собственных исключений.
Библиотека MFC содержит следующий набор классов, производных от CException, поддерживающих обработку ряда стандартных исключений:
• CArchiveException - исключения при работе с архивом;
• CDaoException - исключения, возникающие при сбоях в работе с DAO-объектами баз данных;
• CDBException - исключения, возникающие при сбоях использования баз данных, подключаемых посредством ODBC;
• CFileException - исключения при работе с файлами;
• CMemoryException - исключения по отсутствию выделяемой памяти;
• CNotSupportedException - исключения от использования неподдерживаемых операций;
• COleException - исключения при работе с OLE;
• COleDispatchException - исключения при работе с OLE automation. Эти исключения бросаются сервером, а обрабатываются клиентом;
• CResourceException - исключения, возникающие при неудачной загрузке ресурсов Windows;
• CUserException - исключения, используемые для прерывания операций пользователя.
Далее рассмотрим последовательно все классы исключений и общедоступные члены этих классов.
Класс Cexception
Абстрактный класс CException является базовым классом всех классов исключений в MFC. ч
Эти исключения можно использовать в макросах THROW, THROW_LAST, TRY, CATCH, AND_CATCH, END_CATCH.
Для обработки исключений следует использовать соответствующий производный класс. Если же требуется обрабатывать все типы исключений, то можно использовать метод CException совместно с CObject::IsKindOf.
Отметим, что метод CObject::IsKindOf можно использовать только для классов, объявленных с макросом IMPLEMENT_DYNAMIC, который обеспечивает возможность динамической проверки типов.
Аналогично любые создаваемые производные классы исключений также должны использовать макрос IMPLEMENT_DYNAMIC.
Информацию о возникшей ошибке можно получить, используя методы GetErrorMessage и ReportError.
Очень важно помнить, что если исключение ловится каким-либо макросом, то объект CException удаляется потом автоматически. Если же исключение ловится с использованием ключевого слова catch, то автоматическое удаление объекта исключения не происходит.
Члены класса
virtual BOOL GetErrorMessage( LPTSTR ipszError, UINT nMaxError, PUINT pnHelpContext = NULL);
Метод заносит в указанный буфер сообщение о причинах возникновения ошибки.
При успешном завершении метода возвращается ненулевое значение. Параметры:
IpszError - указатель буфера, в который заносится текст сообщения об ошибке.
nMaxError - максимально допустимое количество помещаемых в буфер символов (включая 0-символ).
pnHelpContext - ID-идентификатор контекста справки. Пример:
CFile filelnput; С File Exception ex;
if (!fileInput.Open("\\Too\\Many\\Bad\\Dirs.DAT", CFile::modeRead, &ex)) {
TCHAR szCause[255];
CString strFormatted;
ex.GetErrorMessage(szCause, 255); // Получение сообщения об ошибке
strFormatted = _Т("Ошибка открытия файла. Причина: ");
strFormatted += szCause;
AfxMessageBox(strFormatted); }
else { filelnput. Close();}
virtual int ReportError (UINT nType = MB_OK, UINT nMessagelD = 0); Метод направляет сообщение об ошибке в стандартное диалоговое окно. При успешном завершении метод возвращает значение A&MessageBox. Если окно сообщений отобразить нельзя (отсутствует необходимая память), то метод возвращает значение 0.
Параметры:
пТуре - стиль отображения окна сообщений. Этот параметр может содержать любую допустимую комбинацию стилей окна сообщений. По умолчанию используется стиль МВ_ОК.
nMessagelD - при значении 0 (по умолчанию) отображается сообщение "No error message is available". Пример:
CFile filelnput;
CFileException ex;
if (!fileInput.Open('\\Too\\Many\\Bad\\Dirs.DAr', CFile::modeRead, &ex))
{ ex.ReportError(); }
else
{ fileInput.Close(); }
Класс CarchiveException
Класс CArchiveException содержит данные-члены класса, указывающие причину возникновения исключительной ситуации при работе с архивом.
Члены класса CArchiveException
CArchiveException( int cause = CArchiveException::none ); Конструктор объекта CArchiveException.
Параметры:
cause - переменная перечислимого типа, указывающая причину возникновения исключения. Список исключений содержится в переменной класса mcause.
Отметим, что для броска данного исключения следует использовать глобальную функцию AfxThrowArchiveException.
CArchiveException: :m_cause
Данная переменная класса указывает причину возникновения исключения.
В следующей таблице приведены по порядку возможные значения данной переменной перечислимого типа.
Переменная |
Значение |
CArchiveException::none |
Ошибки не произошло |
CArchiveException::generic |
Произошла неизвестная ошибка |
CArchiveException::readOnly |
Попытка записи в архив, открытый для загрузки |
CArchiveException-endOfFile |
Достигнут конец файла |
CArchiveException: :writeOnly |
Попытка чтения из архива, открытого для сохранения |
С Archive Exception: :badlndex |
Неизвестен формат файла |
CArchiveException: :badCIass |
Попытка чтения объекта в объект неверного типа |
CArchiveException: :badSchema |
Попытка чтения объекта с другой версией класса |
Класс CfileException
Класс CFUeException используется для обработки ошибок, возникающих при работе с файлами. Объекты данного класса создаются при броске исключения функциями класса CFile или функциями производных от него классов.