Справочник по Ada (Ada 2022)
A.13 Исключение ввода-вывода
Пакет IO_Exceptions определяет исключения, используемые предопределенными пакетами ввода-вывода.
Статическая семантика
В библиотечном пакете IO_Exceptions есть следующее объявление:
package Ada.IO_Exceptions
with Pure is
with Pure is
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.