Ada:打开一个不存在的文件时抛出错误的异常

时间:2012-03-21 12:02:00

标签: file exception ada

这是[post] Ada: Adding an exception in a separate procedure when reading a file

的后续内容

当我的代码打开一个不存在的文件时,而不是抛出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                (File =>文件,                 Mode => Ada.Text_IO.Out_File,                 名字=>名);

  3. 但没有改善。

    那么如何获得正确 ADA.IO_EXCEPTIONS.NAME_ERROR

    相关问题:

    Ada.Text_IO.Name_ErrorADA.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 个答案:

答案 0 :(得分:2)

输出正是我所期望的:抛出并抓住Name_Error,打印找不到文件,程序继续。 Open_Data不告诉其调用者文件尚未打开,文件的后续操作会触发Status_Error。例如,您可以添加Success : out BooleanOpen_Data的参数,或者引发异常(您自己的一个,或者只是重新加注Name_Error

E.g。

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 :(得分:1)

我正在回复您帖子的更新内容。

由于您选择了错误的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。