Программирование в среде Windows, обработка исключительных ситуаций, страница 3

        }

        else

            delete buffer;

    }

    catch(MyException* exception)

    {

        char* msg = exception->GetError();

        cout << msg << endl;

    }

    return 0;

}

Объект исключения может быть предельно прост, определяя лишь целочисленный код ошибки, либо достаточно сложен и представлять собой тщательно разработанный класс, Библиотека MFC предоставляет набор классов исключений, который включает базовый класс CException и несколько производных от него классов (CMemoryException, CArchiveException, CFileException, CUserException, CInternetException и др.). Абстрактный класс CException имеет конструктор и три метода: Delete(), удаляющий объект исключения, GetErrorMessage(), возвращающий строку, описывающую имевшее место исключение, и ReportError(), который выводит сообщение.

Например, CFileException имеет переменную-член m_cause, содержащую перечислимый тип,  специфицирующий тип исключения. Примеры возможных возвращаемых значений: CFileException::fileNotFound и CFileException::readOnly.

Следующий пример показывает, как проверить содержимое CFileException. Другие типы исключений проверяются аналогично.

try
{
   // Код, выбрасывающий файловой исключение.
}
catch( CFileException* theException )
{
   if( theException->m_cause == CFileException::fileNotFound )
   TRACE( "File not found\n" );
   theException->Delete();
}

Рассмотрим пример использования CException::GetErrorMessage.

CFile fileInput;

CFileException ex;

if (!fileInput.Open("\\Too\\Many\\Bad\\Dirs.DAT", CFile::modeRead, &ex))

   {

      // при невозможности открытии файла

      // можно получить точную диагностику

      // и вывести сообщение об этом

      TCHAR   szCause[255];

      CString strFormatted;

      ex.GetErrorMessage(szCause, 255);