Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Класс
Базовый класс для всех исключений библиотеки классов 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 ).
Иерархия наследования
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();
}