Введение в программирование - Учебное пособие (Корочкин А. В.)

10.6 примеры

П   Пример 1.

Процедура для вычисления факториала.

procedure Factorial ( N : natural ) return integer   is begin

if   N = 0   then return 1 ;

else

return N * Factorial ( N -1 ); - - возбуждение исключения

end   if; excepion                - - обработчик исключения

when   ConsraintJError  = >       return   Integer'Last; end    Factorial;

При выполнении функции вычисления факториала возможны ис­ключительные ситуации, связанные с тем , что :

•   аргмент функции может быть задан отрицательным числом ;

•   аргумент функции имеет большое значение и при вычислении функ­ции произойдет переполнение.

В первом случае предопределенное исключение Constaint_Error по несоответствию формального и фактического параметров возбужда­ется в программе, где вызывается функция Factorial, и соответствую­щий обработчик исключения должен быть предусмотрен в ней.

Во втором случае исключение ConstrainJError по переполнению воз­буждается уже при выполнении функции и обработчик исключения размещается в самой функции. Действия обработчика приведут к тому, что выполнение подпрограммы не завершится аварийно и в качестве результата при переполнении функция Factorial возвращает макси­мально допустимое в реализации значение целого типа.

15  — Корочкин А.   В.

Глава 10. Исключения

115

Ада 95. Введение в программирование

114

 

 

D   Пример 2.

Настраиваемый пакет для работы с буфером.

generic

N :     positive ;

in      Elem); out   Elem );

type    Elem    is    private; package    BUFFEFM/VORK;

procedure              ln_Buffer (X :

procedure              Out_Elem (Y

procedure              Cfean_Buffer;

Over : exception;    - - исключения Full   : exception ;

end    BUFFER_WORK;

package body   BUFFER_WORK  is

Index :   integer : = 0;

Buffer:   array  (1 .. N ) of Elem ;

procedure    Clean_Buffer  is begin

for i   in    1 . . N    loop Buffer (i): = 0.0;

end   loop; end Clean Buffer;

end     In Buffer ;

procedure Out_Buffer ( Y :   out    Elem )   is begin

if   Index = 1    then

raise    Full;            - - возбуждение исключения при

- -  отсутствии данных в буфере else

Index   : =   Index -1 ; Y        : =   Buffer (Index) ; end  if; end Out_Buffer;

end    BUFFER_WORK;

В данном примере настраиваемый пакет Buffer_Work         предос­ тавляет пользователю пакета ресурсы для работы с некоторым буфе­ ром размерности N и типом элементов Elem. Ресурсами являются три процедуры : очистки буфера, записи в буфер по текущему индексу ( указатель Index ) и считывания из буфера верхнего элемена (указатель Index - 1). В пакете предусмотрены два исключения :

•   Full   -   для возбуждения исключения при попытке считывании ин­формации из пустого буфера;

•   Over - -   для возбуждения исключения при попытке записи в запол­ненный буфер.

Так как обработчики исключений Full и Over отсутствуют в пакете, то при возбуждении этих исключений их обработка должна вы­полняться в тех частях пользовательской программы, где осуществля­ется вызов процедур In_Buffer и Out_Buffer.

15»

procedure   ln_Buffer (X : in   Elem ) is begin

if   Index  > N then

raise   Over;           - - исключение по переполнению else

Buffer (i): = X ; Index : = Index + 1 ; end   if;

116

Глава 11. Настраиваемые модули

Ада 95. Введение в программирование

117