comp.lang.ada
 help / color / mirror / Atom feed
From: "Anisimkov" <anisimkov@yahoo.com>
Subject: Re: I/O - exception handling
Date: Tue, 27 May 2003 08:36:58 +0600
Date: 2003-05-27T08:36:58+06:00	[thread overview]
Message-ID: <bauf7t$tei$1@ns.omskelecom.ru> (raw)
In-Reply-To: bat3ee$2ec$1@ns.felk.cvut.cz


"Sergey Koshcheyev" <serko84@hotmail.com> wrote in message
news:bat3ee$2ec$1@ns.felk.cvut.cz...

> procedure Read_Something (...) is
>    use Ada.Text_IO;
>    use Ada.Strings.Unbounded;
>    use Ada.Strings.Unbounded.Text_IO;
>    --  GNAT-specific package, I believe
>
>    File : File_Type;
>    S1, S2 : Unbounded_String;
>
> begin
>    Open (File, Name => "test.txt", Mode => In_File);
>    Get_Line (File, S1);
>    Get_Line (File, S2);
>    Close (File);
>
> exception
>    when others =>
>       if Is_Open (File) then
>          begin
>             Close (File);
>          exception
>             --  Close can raise exceptions too!
>             when others => null;
>          end;
>       end if;
> end Read_Something;
>
> However, this looks ugly to me, since I have to close the file in two
> places, and also guard for exceptions while handling exceptions. Is there a
> better solution or is this sort of thing OK in the Ada way?

Your should not catch exception on the Close, becouse Ada95 RM A.8.2 File
Management
says "The exception Status_Error is propagated if the given file is not
open.". So if file is Open, you do not need to wait exception. I thing GNAT
spetsific Ada.Strings.Unbounded.Text_IO.Close have the same behavior. If you
are want to catch exception anyway (for example you are using any other IO
implementation.) you can make local procedure inside of Read_Something.

 procedure Read_Something (...) is
    use Ada.Text_IO;
    use Ada.Strings.Unbounded;
    use Ada.Strings.Unbounded.Text_IO;
    --  GNAT-specific package, I believe

    File : File_Type;
    S1, S2 : Unbounded_String;

   procedure Close_File is
   begin
       if Is_Open (File) then
          begin
             Close (File);
          exception
             --  Close can raise exceptions too!
             when others => null;
          end;
       end if;
   end Close_File;

 begin
    Open (File, Name => "test.txt", Mode => In_File);
    Get_Line (File, S1);
    Get_Line (File, S2);
    Close_File;

 exception
    when others =>
         Close_File;
end Read_Something;

But, in my point of view, it is bad practice to suppress exception
completely. I prefer to know about errors in program execution. If we do not
suppress exception, code become simplier. We need to catch exceptions only in
Get_Line routines. Exceptions in Open routine do not need to be catched
becouse we do not need to close not opened file. For the Ada semantic File we
can write just.

 procedure Read_Something (...) is
    use Ada.Text_IO;
    use Ada.Strings.Unbounded;
    use Ada.Strings.Unbounded.Text_IO;
    --  GNAT-specific package, I believe

    File : File_Type;
    S1, S2 : Unbounded_String;


begin
    Open (File, Name => "test.txt", Mode => In_File);
    Get_Line (File, S1);
    Get_Line (File, S2);
    Close (File);

exception
    when Device_Error | Data_Error =>
          --  Device_Error and Data_Error could be raised only on IO
operations
          --  So the file is already opened and we do not need to check is
file open
          --  before close.

          Close_File (File);
          raise;
end Read_Something;






  parent reply	other threads:[~2003-05-27  2:36 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-05-26 13:05 I/O - exception handling Sergey Koshcheyev
2003-05-26 13:33 ` Preben Randhol
2003-05-26 14:11   ` Sergey Koshcheyev
2003-05-26 14:29     ` Preben Randhol
2003-05-26 14:31       ` Preben Randhol
2003-05-26 14:39       ` Sergey Koshcheyev
2003-05-26 16:57         ` Preben Randhol
2003-05-26 17:48           ` Sergey Koshcheyev
2003-05-26 18:08             ` Preben Randhol
2003-05-26 18:48               ` Sergey Koshcheyev
2003-05-27  1:24                 ` Hyman Rosen
2003-05-27  2:20                   ` Larry Kilgallen
2003-05-27  2:38                     ` Hyman Rosen
2003-05-27 16:17                       ` Warren W. Gay VE3WWG
2003-05-27 19:40                         ` Hyman Rosen
2003-05-27 20:18                           ` Warren W. Gay VE3WWG
2003-05-27 10:31                     ` Larry Kilgallen
2003-05-27 21:43                       ` Hyman Rosen
2003-05-27  5:33           ` Robert I. Eachus
2003-05-27 13:53             ` Preben Randhol
2003-05-27 12:01           ` Lutz Donnerhacke
2003-05-26 14:12   ` Simon Wright
2003-05-26 14:24     ` Preben Randhol
2003-05-26 14:52 ` Jean-Pierre Rosen
2003-05-26 15:26   ` Sergey Koshcheyev
2003-05-26 15:45 ` Hyman Rosen
2003-05-26 16:25   ` Sergey Koshcheyev
2003-05-27  1:35     ` Hyman Rosen
2003-05-28 21:47       ` Robert A Duff
2003-05-26 16:31 ` Steve
2003-05-27  2:36 ` Anisimkov [this message]
2003-05-27  7:21   ` Sergey Koshcheyev
2003-05-27 13:47     ` Preben Randhol
2003-05-27 19:01       ` Sergey Koshcheyev
2003-05-27 16:50     ` Dmitriy Anisimkov
2003-05-27 18:11       ` Ludovic Brenta
2003-05-28  1:27   ` Jeffrey Carter
2003-05-28  7:33     ` Sergey Koshcheyev
2003-05-28  9:08       ` Preben Randhol
2003-05-28 18:07         ` Randy Brukardt
2003-05-28 22:51           ` Robert I. Eachus
2003-05-29  2:03             ` Jeffrey Carter
2003-05-29  8:39               ` Manuel Collado
2003-05-30  6:56           ` Preben Randhol
2003-05-30  9:33             ` Larry Kilgallen
2003-05-30 11:13               ` Preben Randhol
2003-05-30 11:39                 ` Larry Kilgallen
2003-05-30 11:41                   ` Preben Randhol
2003-05-30 19:51                 ` Randy Brukardt
2003-06-01 16:08                   ` Robert I. Eachus
2003-06-03  0:18                     ` Randy Brukardt
2003-06-03  4:16                       ` Robert I. Eachus
     [not found] ` <slrnbd6m69.vh.lutz@taranis.iks-jena.de>
2003-05-27 14:06   ` Preben Randhol
2003-05-27 15:59     ` Lutz Donnerhacke
2003-05-27 19:05   ` Sergey Koshcheyev
2003-05-27 19:32     ` Larry Kilgallen
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox