这是[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)
我尝试了一些事情:
将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 (File =>文件, 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)
出了什么问题?
答案 0 :(得分:2)
输出正是我所期望的:抛出并抓住Name_Error
,打印找不到文件,程序继续。 Open_Data
不告诉其调用者文件尚未打开,文件的后续操作会触发Status_Error
。例如,您可以添加Success : out Boolean
到Open_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。