MessageBox(NULL, 'File fsystem.dat', 'Message', MB_OK);
}
// Обработчик исключения. Вызывается при ошибках
// работы с файлами
catch(...) {
// Отображаем сообщение о возникшей ошибке
MessageBox(NULL, 'File I/O Error', 'Error', MB_OK);
}
return;
}
Файл fsystem.dat, созданный приложением, можно просмотреть в любом текстовом редакторе, например Notepad или WordPad. В листинге 3.2 приведен пример файла, полученного при помощи приложения TestFile на нашем компьютере, на котором установлена операционная система Windows 95.
Метка тома: LIBRARY
Серийный номер: 1D794E8D
Тип файловой системы: FAT
Максимальная длина имени файла: 255
Свойства файловой системы
FS_CASE_IS_PRESERVED
FS_UNICODE_STORED_ON_DISK
Исключения – класс CException
Как мы рассказывали в главе “Обработка исключительных ситуаций”, язык Си++ позволяет вызывать и обрабатывать исключения любого типа. Однако эта возможность практически не используются классами, определенными в библиотеке MFC.
Для обработки исключительных ситуаций, возникающих в MFC, определен специальный класс. Сам класс CException является абстрактным классом. Объекты такого класса создавать нельзя. Для обработки исключительных ситуаций, возникающих в MFC, используется классы наследованные от класса CException:
CMemoryException ←|←CException
CFileException ←|
CArchiveException ←|
CNotSupportedException←|
CResourceException ←|
CDaoException ←|
CDBException ←|
COleException ←|
COleDispatchException ←|
CUserException ←|
Как правило, эти исключения вызываются методами классов MFC, когда возникают какие-либо ошибочные ситуации. Так, например, если вы попытаетесь открыть несуществующий файл, воспользовавшись для этого методом Open из класса CFile, то будет вызвано исключение CFileException.
Если вы желаете обрабатывать исключения, которые вызываются методами классов MFC, вы должны определить обработчики для этих исключений. Каждый такой обработчик должен представлять собой блок catch, в качестве аргумента которого надо использовать указатель на объект класса CException или указатель на объект класса, наследованного от класса CException:
try {
// Здесь может находится код, который вызывает исключение
}
// Обработчик для исключения типа CMemoryException
catch(CMemoryException* ptrException) {
// Обработка исключения …
// В конце удаляем объект исключения
ptrException–>Delete;
}
Еще раз подчеркнем, что обработчик исключений MFC должен принимать указатель на объект класса CException (или класса, наследованного от CException). Этот объект создается при возникновении исключительных ситуаций внутри методов MFC. После того как этот объект окажется не нужен, ваш обработчик должен его удалить. Для этого предназначен метод Delete, определенный в классе CException. Не используйте для удаления объектов класса CException и объектов классов, наследованных от него, обыкновенный оператор delete.
Обработчик исключения может выполнять различные действия в зависимости от того какое исключение и в каком контексте было вызвано. Для этого вы можете использовать методы и данные из объекта, переданного в обработчик исключения.
Методы классов MFC могут вызывать различные исключения. В следующей таблице кратко перечислены причины, по которым вызываются исключения разных типов:
Класс | Исключение вызывается |
---|---|
CMemoryException | При распределении оперативной памяти |
CFileException | При работе с файлами |
CArchiveException | Во время записи или восстановления объектов (Archive/Serialization) |
CNotSupportedException | При обращении к неизвестному методу, который не поддерживается данным классом |