Это продолжение этого [поста] Ада: Добавление исключения в отдельную процедуру при чтении файла
Когда мой код ниже открывает файл, который не существует, вместо ADA.IO_EXCEPTIONS.NAME_ERROR
, он выбрасывает ADA.IO_EXCEPTIONS.STATUS_ERROR
.
Ниже приведены коды.
Основной файл: test_read.adb
:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Float_Text_IO;
procedure Test_Read is
Input_File : File_Type;
value : Long_Float;
procedure Open_Data (File : in out Ada.Text_IO.File_Type; Name : in String) is separate;
begin
Open_Data (File => Input_File, Name => "fx.txt");
while not End_Of_File (Input_File) loop
Ada.Long_Float_Text_IO.Get (File => Input_File, Item => value);
Ada.Long_Float_Text_IO.Put (Item => value, Fore => 3, Aft => 5, Exp => 0);
Ada.Text_IO.New_Line;
end loop;
Ada.Text_IO.Close (File => Input_File);
end Test_Read;
И тело процедуры separate
test_read-open_data.adb
:
separate (test_read)
procedure Open_Data (File : in out Ada.Text_IO.File_Type;
Name : in String) is
--this procedure prepares a file for reading
begin
begin
Ada.Text_IO.Open
(File => File,
Mode => Ada.Text_IO.In_File,
Name => Name);
exception
when Ada.Text_IO.Name_Error =>
Ada.Text_IO.Put(File => Standard_Error, Item => "****File not found....****");
end;
end Open_Data;
Выдается сообщение об ошибке :
****File not found....****
Execution terminated by unhandled exception
Exception name: ADA.IO_EXCEPTIONS.STATUS_ERROR
Message: file not open
Call stack traceback locations:
0x40bf0f 0x40ead0 0x424b08 0x424e4a 0x4010b4 0x401146 0x7c817075
[2012-03-21 13:45:44] process exited with status 1 (elapsed time: 00.13s)
Я пробовал несколько вещей:
Положите with Ada.IO_Exceptions;
в test_read.adb
и поставьте when Ada.IO_Exceptions.Name_Error =>
вместо when Ada.Text_IO.Name_Error =>
в test_read-open_data.adb
. Но без изменений.
В test_read-open_data.adb
я изменил строку Mode => Ada.Text_IO.In_File
, чтобы она стала Mode => Ada.Text_IO.Out_File
, как показано ниже:
Ada.Text_IO.Open
(Файл => Файл,
Mode => Ada.Text_IO.Out_File,
Имя => Имя);
Но улучшения нет.
Так как же получить правильно ADA.IO_EXCEPTIONS.NAME_ERROR
?
Смежный вопрос:
В чем разница между Ada.Text_IO.Name_Error
и ADA.IO_EXCEPTIONS.NAME_ERROR
? В моей программе я хочу получать информацию, когда файл с именем fx.txt
не существует. Какое из этих двух исключений подходит?
Большое спасибо
ОБНОВЛЕНИЕ (последние коды)
Вот мои обновленные коды:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Float_Text_IO;
procedure Test_Read is
Input_File : File_Type;
value : Long_Float;
Success : Boolean;
procedure Open_Data (File : in out Ada.Text_IO.File_Type; Name : in String; Success : out Boolean) is separate;
begin
Open_Data (File => Input_File, Name => "fx.txt", Success => Success);
if not Success then
return;
end if;
while not End_Of_File (Input_File) loop
Ada.Long_Float_Text_IO.Get (File => Input_File, Item => value);
Ada.Long_Float_Text_IO.Put (Item => value, Fore => 3, Aft => 5, Exp => 0);
Ada.Text_IO.New_Line;
end loop;
Ada.Text_IO.Close (File => Input_File);
Ada.Text_IO.Put_Line (Item => "Reading file success: " & Boolean'Image (Success));
end Test_Read;
и процедура separate
:
separate (test_read)
procedure Open_Data (File : in out Ada.Text_IO.File_Type;
Name : in String; Success : out Boolean) is
--this procedure prepares a file for reading
begin
Success := True;
begin
Ada.Text_IO.Open
(File => File,
Mode => Ada.Text_IO.Out_File,
Name => Name);
exception
when Ada.Text_IO.Name_Error =>
Success := False;
Ada.Text_IO.Put (File => Standard_Error, Item => "****File not found....****");
end;
end Open_Data;
При компиляции при наличии файла fx.txt , я получаю:
Execution terminated by unhandled exception
Exception name: ADA.IO_EXCEPTIONS.MODE_ERROR
Message: file not readable
Call stack traceback locations:
0x40bf2b 0x40ead0 0x424b58 0x424f5a 0x4010b4 0x401146 0x7c817075
[2012-03-22 08:39:39] process exited with status 1 (elapsed time: 00.14s)
А содержимое файла fx.txt
** стирается и его содержимое не отображается при запуске программы **
При компиляции с файлом fx.txt, переименованным в fy.txt , я получаю:
****File not found....****
[2012-03-22 08:45:31] process terminated successfully (elapsed time: 00.13s)
Так что же пошло не так?