Обработка ошибок ввода-вывода
Все действия, связанные с реализацией базовых операций ввода-вывода, являются серьезным потенциальным источником ошибок. Объясняется это просто. Дело в том, что на этапе создания, чтения или записи данных достаточно трудно отследить текущее состояние операционной системы и, в частности, конкретного файла. Например, используемый нами файл может быть захвачен двумя и более процессами, и эти процессы могут попытаться одновременно произвести с ним абсолютно несовместимые операции: запись данных и удаление либо чтение данных и переименование и т. п.
Таблица 4.1. Характерные ошибки операций ввода-вывода
Номер | Название | Операция | Описание |
Disk read error Disk write error File not assigned File not open File not open for input | Read CloseFile, Write, WriteIn, Flush Reset, Rewrite, Append, Rename, Erase CloseFile, Read, Write, Seek, Eof, FilePos, FileSize, Flush, Block- Read, BlockWrite Read, Readln, Eof, Eoln, SeekEof, SeekEoln | Попытка чтения за пределами файла. Ошибка записи, например при нехватке места на диске. В файловой переменной нет ссылки на файл. Например, не был вызван метод AssignFile(). Файл не был открыт. Файл открыт не в режиме для чтения. |
Достаточно опытный программист может позволить себе некоторую вольность и отключить реакцию Delphi на ошибки ввода-вывода. Для этого в листинге перед процедурами работы с файлами укажите соответствующую директиву компилятору {$I-}, но в этом случае обработка ошибок перекладывается на вас. Не забудьте все вернуть в исходное состояние, включив «обесточенную» опцию {$I+}. Код возможной ошибки возвратит метод:
function IOResult: Integer;
Если же все завершилось удачно, то результатом окажется ноль. Продемонстрируем это на примере. Взгляните на следующие абсолютно стандартные строки кода:
var F : File;
Buffer : array[0..255] of byte;
Begin
AssignFile(F,'c:\test.tst');
TRY
Reset(f,255);
BlockRead(F,Buffer,1);
FINALLY
CloseFile(f);
END;
End.
Однако вполне работоспособный код откажется работать, если в корне диска C:\ не окажется тестового файла с названием test.tst. В таком случае на экране компьютера появится сообщение, информирующее нас о таком прискорбном факте. А теперь применим наши знания относительно обработки ошибок ввода-вывода и напишем более жизнестойкие строки.
var F : File;
Buffer : array[0..255] of byte;
Begin
AssignFile(F,'c:\test.tst');
{$I-}
Reset(f,255);
ifIOResult=0 then
Begin
BlockRead(F,Buffer,1);
CloseFile(f);
End
elseWriteLn('Sorry! File not found!');
{$I+}
ReadLn;
End.
Дата добавления: 2016-03-15; просмотров: 1022;