Ада: выдает неправильное исключение при открытии несуществующего файла - PullRequest
0 голосов
/ 21 марта 2012

Это продолжение этого [поста] Ада: Добавление исключения в отдельную процедуру при чтении файла

Когда мой код ниже открывает файл, который не существует, вместо 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)

Я пробовал несколько вещей:

  1. Положите with Ada.IO_Exceptions; в test_read.adb и поставьте when Ada.IO_Exceptions.Name_Error => вместо when Ada.Text_IO.Name_Error => в test_read-open_data.adb. Но без изменений.

  2. В 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)

Так что же пошло не так?

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Вывод - именно то, что я ожидал: Name_Error выбрасывается и перехватывается, Файл не найден распечатывается, и программа продолжается. Open_Data не сообщает вызывающей стороне, что файл не был открыт, и последующие операции над файлом вызывают Status_Error. Вы можете, например, добавить Success : out Boolean к Open_Data параметрам или вызвать исключение (одно из ваших, или просто повторно повысить Name_Error.

1011 * Е.Г. *

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
1 голос
/ 25 марта 2012

Я отвечаю на обновленный контент вашего поста.

Содержимое вашего файла удаляется, потому что вы выбрали неправильный File_Mode. Судя по остальной части вашего кода, вы намеревались читать из файла, но вы указали Ada.Text_IO.Out_File в качестве режима работы, который указывает, что файл будет использоваться для записи.

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

Что касается создаваемого исключения ADA.IO_EXCEPTIONS.MODE_ERROR. Вы просили прочитать из дескриптора файла, открытого в режиме только записи (Out_File) - это явная ошибка, приводящая к возникновению исключения.

В итоге. Измените режим в вызове на Ada.Text_IO.Open с Ada.Text_IO.Out_File на Ada.Text_IO.In_File.

...