Справочник по Ada 2012
A.13 Исключения при вводе-выводе
Пакет IO_Exceptions определяет исключения, необходимые предопределенным пакетам ввода-вывода.
Статическая семантика
Пакет библиотеки IO_Exceptions имеет следующее объявление:
package Ada.IO_Exceptions is
pragma Pure(IO_Exceptions);
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;
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;
Если существует более одной ошибки, соответствующее исключение, которое появляется раньше в следующем списке, будет тем, которое будет распространено.
Исключение Status_Error распространяется при попытке выполнить операцию над файлом, который не открыт, и при попытке открыть файл, который уже открыт.
Исключение Mode_Error распространяется при попытке чтения из файла или проверки конца файла, если текущий режим файла равен Out_File или Append_File, а также при попытке записи в файл, если текущий режим файла равен In_File. В случае Text_IO, исключение Mode_Error также распространяется при указании файла с текущим режимом Out_File или Append_File в вызове Set_Input, Skip_Line, End_Of_Line, Skip_Page или End_Of_Page; и при указании файла с текущим режимом In_File в вызове Set_Output, Set_Line_Length, Set_Page_Length, Line_Length, Page_Length, New_Line или New_Page.
Исключение Name_Error распространяется при вызове Create или Open, если строка, заданная для параметра Name, не позволяет идентифицировать внешний файл. Например, это исключение распространяется, если строка некорректна или если ни один, или более одного внешнего файла соответствует строке.
Исключение Use_Error распространяется, если операция невозможна по причинам, зависящим от характеристик внешнего файла. Например, это исключение распространяется процедурой Create, среди прочих обстоятельств, если заданный режим является Out_File, но форма указывает только на устройство ввода, если параметр Form указывает некорректные права доступа или если внешний файл с заданным именем уже существует, а перезапись не разрешена.
Исключение Device_Error распространяется, если операция ввода-вывода не может быть завершена из-за сбоя в работе базовой системы.
Исключение End_Error распространяется при попытке пропустить конец файла (прочитать за концом файла).
Исключение Data_Error может быть распространено процедурой Read (или атрибутом Read), если прочитанный элемент не может быть интерпретирован как значение требуемого подтипа. Это исключение также распространяется процедурой Get (определенной в пакете Text_IO), если последовательность входных символов не удовлетворяет требуемой синтаксической структуре или если введенное значение не принадлежит диапазону требуемого подтипа.
Исключение Layout_Error распространяется (при текстовом вводе-выводе) процедурами Col, Line или Page, если возвращаемое значение превышает Count'Last. Исключение Layout_Error также распространяется при выводе при попытке установить номера столбцов или строк, превышающие заданную максимальную длину строки или страницы соответственно (исключая неограниченные случаи). Также оно распространяется при попытке передать слишком много символов в строку.
Эти исключения также распространяются различными другими пакетами и операциями, определенными языком, см. определение этих сущностей для других причин, по которым эти исключения распространяются.
Требования к документации
Реализация должна документировать условия, при которых распространяются Name_Error, Use_Error и Device_Error.
Разрешения для реализации
Если связанная проверка слишком сложная, реализация не обязана распространять Data_Error в качестве части процедуры Read (или атрибута Read), если прочитанное значение не может быть интерпретировано как значение требуемого подтипа.
Ошибочное выполнение
Если элемент, считанный процедурой Read (или атрибутом Read), не может быть интерпретирован как значение требуемого подтипа, но это не обнаруживается и Data_Error не распространяется, то результирующее значение может быть ненормальным, а последующие обращения к значению могут привести к ошибочному выполнению, как описано в 13.9.1.