заносится код, по которому можно определить причину исключения.
Константа | Причина ошибки |
---|---|
CFileException::none | Без ошибки |
CFileException::generic | Неопределенная ошибка |
CFileException::fileNotFound | Файл не найден |
CFileException::badPath | Задан несуществующий путь |
CFileException::tooManyOpenFiles | Открыто слишком много файлов |
CFileException::accessDenied | Доступ к файлу закрыт |
CFileException::invalidFile | Использование неправильного идентификатора (дескриптора) файла |
CFileException::removeCurrentDir | Попытка удалить текущий каталог |
CFileException::directoryFull | Переполнение структуры каталогов. Невозможно создать новый каталог |
CFileException::badSeek | Ошибка во время перемещения указателя файлов |
CFileException::hardIO | Ошибка аппаратного обеспечения компьютера |
CFileException::sharingViolation | Программа SHARE.EXE не загружена или общая область заблокирована (locked) |
CFileException::lockViolation | Попытка заблокировать область файла, которая уже была заблокирована ранее |
CFileException::diskFull | Нет свободного пространства на диске |
CFileException::endOfFile | Достигнут конец файла |
Так как за взаимодействие приложения с файловой системной компьютера отвечает прежде всего операционная система, то в случае ошибки она возвращает соответствующий код. В состав класса CFileException входит элемент данных m_lOsError. В него заносится код ошибки, который вернула операционная система.
Приложение Except, исходный текст которого представлен в листинге 3.3, показывает как можно выполнить обработку исключительных ситуаций. Оно содержит блок try и несколько обработчиков исключений для объектов типа CMemoryException, CFileException, CException, а также универсальный обработчик. Если в блоке try вызывается исключение, связанное с ошибкой в файловой системе или системе распределения памяти, оно обрабатывается соответствующими блоками catch. Если исключение вызвано с объектом другого типа, но наследованным от класса CException, например CArchiveException, CNotSupportedException или CResourceException, тогда оно обрабатывается блоком catch для объектов CException. И наконец, если объект исключения не имеет базовым классом CException, оно обрабатывается в последнем блоке catch.
#include 'stdafx.h'
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
try {
CFile file('This file is absent', CFile::modeRead);
// Здесь могут быть операторы, вызывающие другие
// исключения
}
// Обработчик для исключения типа CMemoryException
catch(CMemoryException* ptrException) {
MessageBox(NULL,'Memory Exception', 'Exception', MB_OK | MB_ICONSTOP);
ptrException–>Delete();