11.4.3 Example of Exception Handling
Examples
Exception handling
may be used to separate the detection of an error from the response to
that error:
{
AI95-00433-01}
package File_System
is
type File_Handle
is limited private;
File_Not_Found : exception;
procedure Open(F : in out File_Handle; Name : String);
-- raises File_Not_Found if named file does not exist
End_Of_File : exception;
procedure Read(F : in out File_Handle; Data : out Data_Type);
-- raises End_Of_File if the file is not open
...
end File_System;
{
AI95-00433-01}
package body File_System
is
procedure Open(F :
in out File_Handle; Name : String)
is
begin
if File_Exists(Name)
then
...
else
raise File_Not_Found
with "File not found: " & Name & ".";
end if;
end Open;
procedure Read(F : in out File_Handle; Data : out Data_Type) is
begin
if F.Current_Position <= F.Last_Position then
...
else
raise End_Of_File;
end if;
end Read;
...
end File_System;
with Ada.Text_IO;
with Ada.Exceptions;
with File_System; use File_System;
use Ada;
procedure Main is
begin
... -- call operations in File_System
exception
when End_Of_File =>
Close(Some_File);
when Not_Found_Error : File_Not_Found =>
Text_IO.Put_Line(Exceptions.Exception_Message(Not_Found_Error));
when The_Error : others =>
Text_IO.Put_Line("Unknown error:");
if Verbosity_Desired then
Text_IO.Put_Line(Exceptions.Exception_Information(The_Error));
else
Text_IO.Put_Line(Exceptions.Exception_Name(The_Error));
Text_IO.Put_Line(Exceptions.Exception_Message(The_Error));
end if;
raise;
end Main;
In the above example, the File_System package contains
information about detecting certain exceptional situations, but it does
not specify how to handle those situations. Procedure Main specifies
how to handle them; other clients of File_System might have different
handlers, even though the exceptional situations arise from the same
basic causes.
Wording Changes from Ada 83
The sections labeled “Exceptions Raised
During ...” are subsumed by this clause, and by parts of Section
9.