Обработка ошибок ввода-вывода

Смысл в том, чтобы самому следить за вероятными ошибками. Для слежки используют функцию IOResult, которая не имеет параметров и возвращает ноль, если ошибок ввода-вывода не произошло. А если эта неприятность все же случилась, функция вернет ненулевой код ошибки, по которому легко выяснить её причину. Обратите внимание: функция возвращает состояние последней выполнявшейся операции ввода-вывода. При ошибке дальнейшая работа с файлом автоматически блокируется до его повторного открытия.

Рассмотрим способ безаварийного определения наличия файла на диске (здесь имя файла содержится в переменной FileName).

Assign(F, FileName); Reset(F);

if IOResult=0

      then Writeln (’Нашелся файл ’+ FileName)

      else Writeln (’Файл ’+FileName+’ не обнаружен!’);

Этот фрагмент надёжно сработает только при отключенном флажке «I/O checking», иначе программа может прерваться аварийно. Стало быть, перед компиляцией надо проверять состояние флажка, а это хлопотно и ненадежно.

В настройках опций компилятора через меню есть и другой изъян. Как быть, когда в разных местах программы требуется по-разному реагировать на ошибки: где-то включить этот контроль, а где-то нет? Но флажок действует на всю программу в целом, глобально, – он не допускает выборочной настройки. Что делать?

Директивы компилятора

Выручают директивы, – особые сочетания символов, избирательно настраивающие компилятор. Директивы не являются элементами языка, поэтому вставляются в программу по-хитрому – внутри комментариев. Ведь комментарии, как известно, компилятор должен игнорировать, пропускать мимо ушей. Но компилятор просматривает и комментарии, «процеживая» их в поисках директив (подобно тому, как мы «процеживали» строки в поиске заменяемых символов).

Большинство директив выглядит как сочетание символа доллара «$» с латинской буквой и последующего знака «+» или «–». Все это заключается внутрь комментария. Знак «+» включает действие директивы, а «–» – отключает, что равносильно установке или сбросу флажков на вкладке опций компилятора. Например, директива, управляющая реакцией на ошибки ввода-вывода, записывается так:

{ $I+       - включить контроль ввода-вывода }

{ $I-       - отключить контроль ввода-вывода }

В один комментарий можно вместить несколько директив. Перечень директив вы найдете в справке по компилятору и в приложении Ж.

Директиву – в студию!

Сейчас мы извлечем первую пользу из директив: сотворим функцию, определяющую наличие файла на диске. Применим для этого директиву $I. Наша булева функция будет возвращать TRUE, если файл, имя которого передано в параметре, существует. Вот её текст, а заодно и фрагмент тестирующей программы.

{ P_27_1 – определение наличия заданного файла }

function FileExists(const aName: string): boolean;

var F: text;

begin

      FileExists:= false; { предполагаем, что файла нет }

      Assign(F, aName);

      {$I-} Reset(F); {$I+} { контроль отключен на время Reset }

      if IOResult=0 then begin { если файл существует }

      Close(F);       { закрываем файл }

      FileExists:= true;

      end;

end;

Вы читаете Песни о Паскале
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату