Класс 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
макросами , ,try
THROW_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++- try
catch
. Если вы используете макросы 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();
}