Справочник по Ada 95
11.4.2 Пример обработки исключений
Примеры
Обработка исключений может использоваться для разделения обнаружения ошибки от реакции на неё:
with Ada.Exceptions;
use Ada;
package File_System is
type File_Handle is limited private;
use Ada;
package File_System is
type File_Handle is limited private;
File_Not_Found : exception;
procedure Open(F : in out File_Handle; Name : String);
-- вызывает File_Not_Found, если указанный файл не существует
procedure Open(F : in out File_Handle; Name : String);
-- вызывает File_Not_Found, если указанный файл не существует
End_Of_File : exception;
procedure Read(F : in out File_Handle; Data : out Data_Type);
-- вызывает End_Of_File, если файл не открыт
procedure Read(F : in out File_Handle; Data : out Data_Type);
-- вызывает End_Of_File, если файл не открыт
...
end File_System;
end File_System;
package body File_System is
procedure Open(F : in out File_Handle; Name : String) is
begin
if File_Exists(Name) then
...
else
Exceptions.Raise_Exception(File_Not_Found'Identity,
"Файл не найден: " & Name & ".");
end if;
end Open;
procedure Open(F : in out File_Handle; Name : String) is
begin
if File_Exists(Name) then
...
else
Exceptions.Raise_Exception(File_Not_Found'Identity,
"Файл не найден: " & 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;
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
... -- вызов операций в 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("Неизвестная ошибка:");
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;
with Ada.Exceptions;
with File_System; use File_System;
use Ada;
procedure Main is
begin
... -- вызов операций в 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("Неизвестная ошибка:");
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;
В приведённом примере пакет File_System содержит информацию об обнаружении определённых исключительных ситуаций, но не указывает, как их обрабатывать. Процедура Main определяет, как их обработать; другие клиенты File_System могут иметь разные обработчики, даже если исключительные ситуации возникают из тех же основных причин.