Поделиться через


Класс CException

Базовый класс для всех исключений библиотеки классов Microsoft Foundation.

Синтаксис

class AFX_NOVTABLE CException : public CObject

Участники

Открытые конструкторы

Имя Описание
CException::CException Формирует объект CException.

Открытые методы

Имя Описание
CException::Delete CException Удаляет объект.
CException::ReportError Сообщает сообщение об ошибке в окне сообщения пользователю.

Замечания

Так как CException это абстрактный базовый класс, вы не можете напрямую создавать CException объекты; необходимо создать объекты производных классов. Если вам нужно создать собственный CExceptionкласс -style, используйте один из производных классов, перечисленных выше в качестве модели. Убедитесь, что производный класс также использует IMPLEMENT_DYNAMIC.

Производные классы и их описания перечислены ниже.

Имя Описание
CSimpleException Базовый класс для исключений MFC, критически важных для ресурсов
CInvalidArgException Недопустимое условие исключения аргумента
CMemoryException Исключение вне памяти
CNotSupportedException Запрос на неподдерживаемую операцию
CArchiveException Исключение для архива
CFileException Исключение для конкретного файла
CResourceException Ресурс Windows не найден или не поддерживается
COleException Исключение OLE
CDBException Исключение базы данных (то есть условия исключения, возникающие для классов баз данных MFC на основе open Database Connectivity)
COleDispatchException Исключение диспетчеризации OLE (автоматизация)
CUserException Исключение, указывающее, что не удалось найти ресурс
CDaoException Исключение объекта доступа к данным (т. е. условия исключения, возникающие для классов DAO)
CInternetException Исключение Из Интернета (т. е. условия исключения, возникающие для классов Интернета).

Эти исключения предназначены для использования с THROWмакросами , ,tryTHROW_LAST, , catchа and_catchтакже end_catch макросами. Дополнительные сведения об исключениях см. в статье "Обработка исключений" (MFC).

Чтобы поймать определенное исключение, используйте соответствующий производный класс. Чтобы поймать все типы исключений, использовать CExceptionи использовать CObject::IsKindOf для различения производных CExceptionклассов. Обратите внимание, что CObject::IsKindOf работает только для классов, объявленных с IMPLEMENT_DYNAMIC помощью макроса, чтобы воспользоваться преимуществами динамической проверки типов. Любой производный CExceptionкласс, который вы создаете, также должен использовать IMPLEMENT_DYNAMIC макрос.

Вы можете сообщить сведения об исключениях пользователю, вызвав GetErrorMessage или ReportErrorдве функции-члены, которые работают с любым CExceptionпроизводным классом.

Если исключение поймано одним из макросов, CException объект удаляется автоматически; не удаляйте его самостоятельно. Если исключение поймано с помощью ключевого catch слова, оно не удаляется автоматически. Дополнительные сведения об удалении объекта исключения см. в статье об обработке исключений (MFC ).

Иерархия наследования

CObject

CException

Требования

Заголовок: afx.h

CException::CException

Эта функция-член создает CException объект.

explicit CException(BOOL bAutoDelete);

Параметры

b_AutoDelete
Укажите TRUE , выделена ли память для CException объекта в куче. Это приведет CException к удалению объекта при Delete вызове функции-члена для удаления исключения. Укажите FALSE , CException находится ли объект в стеке или является глобальным объектом. В этом случае CException объект не будет удален при вызове Delete функции-члена.

Замечания

Обычно никогда не нужно вызывать этот конструктор напрямую. Функция, которая вызывает исключение, должна создать экземпляр CExceptionпроизводного класса и вызвать его конструктор или использовать одну из функций создания MFC, например AfxThrowFileExceptionдля создания предопределенного типа. Эта документация предоставляется только для полноты.

CException::Delete

Эта функция проверяет, был ли CException объект создан в куче, а если да, он вызывает delete оператор объекта.

void Delete();

Замечания

При удалении CException объекта используйте Delete функцию-член для удаления исключения. Не используйте delete оператор напрямую, так как CException объект может быть глобальным объектом или создан в стеке.

Можно указать, следует ли удалять объект при создании объекта. Дополнительные сведения см. в разделе CException::CException.

Необходимо вызывать Delete только в том случае, если вы используете механизм C++- trycatch. Если вы используете макросы MFC, а CATCHзатем эти макросы TRY автоматически вызовут эту функцию.

Пример

CFile* pFile = NULL;
// Constructing a CFile object with this override may throw
// a CFile exception, and won't throw any other exceptions.
// Calling CString::Format() may throw a CMemoryException,
// so we have a catch block for such exceptions, too. Any
// other exception types this function throws will be
// routed to the calling function.
// Note that this example performs the same actions as the
// example for CATCH, but uses C++ try/catch syntax instead
// of using the MFC TRY/CATCH macros. This sample must use
// CException::Delete() to delete the exception objects
// before closing the catch block, while the CATCH example
// implicitly performs the deletion via the macros.
try
{
   pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
      CFile::modeRead | CFile::shareDenyNone);
   ULONGLONG ullLength = pFile->GetLength();
   CString str;
   str.Format(_T("Your SYSTEM.INI file is %u bytes long."), ullLength);
   AfxMessageBox(str);
}
catch(CFileException* pEx)
{
   // Simply show an error message to the user.
   pEx->ReportError();
   pEx->Delete();
}
catch(CMemoryException* pEx)
{
   // We can't recover from this memory exception, so we'll
   // just terminate the app without any cleanup. Normally, an
   // an application should do everything it possibly can to
   // clean up properly and _not_ call AfxAbort().
   pEx->Delete();
   AfxAbort();
}
// If an exception occurs in the CFile constructor,
// the language will free the memory allocated by new
// and will not complete the assignment to pFile.
// Thus, our clean-up code needs to test for NULL.
if (pFile != NULL)
{
   pFile->Close();
   delete pFile;
}

CException::ReportError

Вызовите эту функцию-член, чтобы сообщить об ошибке текст в окне сообщения пользователю.

virtual int ReportError(
    UINT nType = MB_OK,
    UINT nMessageID = 0);

Параметры

nType
Задает стиль поля сообщения. Примените к поле любое сочетание стилей окна сообщений. Если этот параметр не указан, используется MB_OKзначение по умолчанию.

nMessageID
Указывает идентификатор ресурса (запись строки таблицы) сообщения, отображаемого, если объект исключения не содержит сообщения об ошибке. Если значение равно 0, отображается сообщение "Сообщение об ошибке недоступно".

Возвращаемое значение

Значение AfxMessageBox ; в противном случае значение 0, если недостаточно памяти для отображения поля сообщения. См AfxMessageBox . возможные возвращаемые значения.

Пример

Ниже приведен пример использования CException::ReportError. Пример см. в примере.CATCH

CFile fileInput;
CFileException ex;

// try to open a file for reading.
// The file will certainly not
// exist because there are too many explicit
// directories in the name.

// if the call to Open() fails, ex will be
// initialized with exception
// information.  the call to ex.ReportError() will
// display an appropriate
// error message to the user, such as
// "\Too\Many\Bad\Dirs.DAT contains an
// invalid path."  The error message text will be
// appropriate for the
// file name and error condition.

if (!fileInput.Open(_T("\\Too\\Many\\Bad\\Dirs.DAT"), CFile::modeRead, &ex))
{
  ex.ReportError();
}
else
{
  // the file was opened, so do whatever work
  // with fileInput we were planning...

  fileInput.Close();
}

См. также

CObject Класс
Диаграмма иерархии
Обработка исключений