Приложение Except
Приложение Except, исходный текст которого представлен в листинге 3.3, показывает как можно выполнить обработку исключительных ситуаций. Оно содержит блок try и несколько обработчиков исключений для объектов типа CMemoryException, CFileException, CException, а также универсальный обработчик. Если в блоке try вызывается исключение, связанное с ошибкой в файловой системе или системе распределения памяти, оно обрабатывается соответствующими блоками catch. Если исключение вызвано с объектом другого типа, но наследованным от класса CException, например CArchiveException, CNotSupportedException или CResourceException, тогда оно обрабатывается блоком catch для объектов CException. И наконец, если объект исключения не имеет базовым классом CException, оно обрабатывается в последнем блоке catch.
Листинг 3.3. Файл Except.cpp
#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 и
// классов наследованных от него
catch(CException* ptrException)
{
MessageBox(NULL,"Exception", "Exception",
MB_OK | MB_ICONSTOP);
ptrException -> Delete();
}
// Все остальные исключения обрабатываются здесь
catch(...)
{
MessageBox(NULL,"Another Exception", "Exception",
MB_OK | MB_ICONSTOP);
}
return 0;
}
В блоке try мы пытаемся открыть для чтения файл с именем This file is absent. Длинные имена файлов, содержащие символы пробелов, разрешены в операционных системах Windows 95 и Windows NT. Если файла This file is absent нет на диске, тогда создается объект класса CFileException и вызывается исключение.
Обработчик исключений, связанных с ошибками при работе с файловой системой, проверяет, вызвано ли оно тем, что приложение пытается открыть несуществующий файл. Если это так, на экране отображается сообщение File Not Found.
После обработки исключения, управление передается первому оператору за последним блоком catch. В нашем примере это оператор return. Он завершает работу приложения.
Вы можете сами создать объект класса CFileException и вызвать исключение. Для этого рекомендуется использовать функцию AfxThrowFileException:
void AfxThrowFileException(int cause, LONG lOsError = –1);
Параметр cause должен определять причину исключения. В качестве этого параметра можно задавать возможные значения для элемента данных m_cause из класса CFileException (см. таблицу выше). Необязательный параметр lOsError может содержать код ошибки, определенной операционной системой.