На этом шаге мы рассмотрим общие принципы обработки исключений.
Легко заметить, что по целому ряду причин функция 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);
}
На следующем шаге мы рассмотрим закрытие файла.