Константа | Причина ошибки |
---|---|
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();
}
// Обработчик для исключения типа CFileException
catch(CFileException* ptrException) {
if (ptrException–>m_cause == CFileException::fileNotFound) MessageBox(NULL,"File Not Found", "Exception", MB_OK | MB_ICONSTOP);
else if (ptrException–>m_cause == CFileException::diskFull) MessageBox(NULL,"The disk is full", "Exception", MB_OK | MB_ICONSTOP);
else MessageBox(NULL, "File Exception", "Exception", MB_OK | MB_ICONSTOP);
ptrException–>Delete();
}
// Обработчик для исключений класса CException и
// классов наследованных от него