Ада-95. Компилятор GNAT

       

Искючения ввода/вывода


Все средства организации ввода/вывода Ады полагаются на механизм исключений для сообщения об ошибках, которые возникли в процессе выполнения какой-либо операции ввода/вывода данных.

Описания исключений ввода/вывода находятся в пакете Ada.IO_Exceptions

который имеет следующий вид:

package Ada.IO_Exceptions is

pragma Pure(IO_Exceptions);

Status_Error : exception; -- попытка обращения к файлу который не был открыт -- или повторное открытие файла Mode_Error : exception; -- попытка чтения из файла который открыт для записи Name_Error : exception; -- попытка открытия не существующего файла -- или попытка попытка создания файла -- с не допустимым именем Use_Error : exception; -- зависит от характеристик внешней среды; -- например, при обращении к файлу -- при отсутствии соответствующих -- привелегий доступа Device_Error : exception; -- запрошенная операция ввода/вывода не может -- быть выполнена по причине неисправности -- оборудования End_Error : exception; -- попытка чтения за концом файла Data_Error : exception; -- прочитанный элемент не соответствует -- ожидаемому типу данных Layout_Error : exception; -- при текстовом вводе/выводе; -- как правило, при выполении операции -- ввода/вывода которая нарушает -- установленные диапазоны значений -- форматирования текста end Ada.IO_Exceptions;

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

Показанная ниже процедура Robust_Open является примером того, как можно попытаться избежать подобные неприятности.

Сначала, она пытается открыть указанный файл, и если это приводит к ошибке говорящей об отсутствии этого файла, то тогда она пытается его создать:

with Ada.Text_IO; use Ada.Text_IO;

procedure Robust_Open(The_File : in out File_type; Mode : in File_mode; Name : in String) is

begin

Open(The_File, Mode, Name);

exception

when Name_Error => Create(The_File, Mode, Name); end Robust_Open;

Следует обратить внимание на то, что на корректность работы этого примера может оказать влияние одновременное выполнение нескольких процессов.




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

Следовательно, есть вероятность того, что за время простоя программы этот файл будет создан другим процессом.

Примером еще одной простой утилиты может служить логическая функция File_Exists, которая позволяет осуществить проверку существования файла:

with Ada.Text_IO; use Ada.Text_IO;

function File_Exists(Name : String) return Boolean is

The_File : Ada.Text_IO.File_Type;

begin

Open(The_File, In_File, Name);

-- файл открылся, закрываем его и возвращаем "истину" Close(The_File); return True;

exception

when Name_Error => -- файл не окрылся, значит его нет return False; end File_Exists;

Эта функция пытается открыть файл и если при этом не возникает исключения Name_Error, то это значит что файл существует, и функция возвращает значение "истина" (если файл уже открыт, то генерируется исключение Use_Error).


Содержание раздела