Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
38
Добавлен:
16.02.2016
Размер:
1.52 Mб
Скачать

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 или функциями производных от него классов.

Соседние файлы в папке VC++Баженова