Шаг 82.
Среда программирования Visual C++.
Класс CFile. Ошибки файловых операций

    На этом шаге мы рассмотрим общие принципы обработки исключений.

    Легко заметить, что по целому ряду причин функция CFile::Open() иногда терпит неудачу. Одна из них - попытка открыть несушествующий файл (не задав при этом флаг CFile::modeCreate). Открытие файла, который находится в исключительном пользовании другого процесса, также вызовет сбой. Кроме того, масса других факторов способна вызвать ошибки при работе с файлами.

    В образце кода, демонстрирующего использование CFile::Open(), функция возвращает булево значение, информирующее об успехе или удаче. В случае неудачи Вас наверняка будет интересовать, почему это произошло, чтобы передать эти сведения пользователю и предложить определенный способ решения возникшей проблемы.

    В MFC есть класс CFileException (производный от базового класса CException), специально предназначенный для работы с ошибками файловых операций. MFC-классы, обслуживающие исключения, содержат данные и функции-члены, которые позволяют получать информацию об ошибке, вызвавшей исключение.

    Если конструктору CFile не удается открыть файл, он генерирует исключение CFileException. Чтобы получить возможность обработать его, Вам придется включить конструктор в блок обработки исключений try/catch:

try
{
  CFile MyFile("MyFile.old",  CFile::modeRead); 
} 
catch(CFileException * fx)
{
  TCHAR buf[255];
  fx->GetErrorMessage(buf, 255); 
  CString strPrompt(buf); 
  AfxMessageBox(strPrompt); 
}

    Функция CFile::Open() не способна генерировать исключения. Вместо этого в нее передается необязательный третий аргумент - указатель на объект CFileException. При сбое в открытии файла в этот объект записывается информация о характере ошибки. Она может ,snь использована в последующем коде для предоставления пользоdfnелю определенной информации. Вот как это сделать:

CFile MyFile; 
CFileException fx;
if (!MyFile.Open("MyFile.old", CFile::modeRead, &fx))
{
  TCHAR buf[255]; 
  fx.GetErrorMessage(buf, 255); 
  CString strPrompt(buf); 
  AfxMessageBox(strPrompt); 
}

    На следующем шаге мы рассмотрим закрытие файла.




Предыдущий шаг Содержание Следующий шаг