OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 16 Август, 2018 13:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Модуль omcRobust - TRY-EXCEPT
СообщениеДобавлено: Суббота, 16 Ноябрь, 2013 20:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8970
Откуда: Россия, Орёл
Культурный, абстрагированная от Kernel TRY-EXCEPT.

Оформлять для коллекции компонентов времени нет, но и "зажимать" жалко.

Использование:
Код:
VAR mySafeProc: Robust.Trial;
...
BEGIN
  mySafeProc.proc := SomeProcedure;
  (* можно это делать заранее *)
  ....

 mySafeProc.Try(msg1, msg2, Robust.dummy);
 IF mySafeProc.ok THEN
    ...
  ELSE
    ...
  END


Код:
MODULE omcRobust;

   IMPORT Kernel, S := SYSTEM;

   TYPE
      TryProc* = PROCEDURE (VAR par1, par2: ANYREC; IN par3: ANYREC);
      TrySig = PROCEDURE (par1, typ1, par2, typ2, par3, typ3: INTEGER);

      Trial* = RECORD
         proc*: TryProc;
         ok-: BOOLEAN;
         error-, pc-: INTEGER
      END;

   VAR
      dummy*: RECORD END;

      tryProc: TrySig;
      par: ARRAY 3 OF RECORD
         par, typ: INTEGER
      END;

      trapCount: INTEGER;

   PROCEDURE Do (x, y, z: INTEGER);
   BEGIN
      tryProc(par[0].par, par[0].typ, par[1].par, par[1].typ, par[2].par, par[2].typ)
   END Do;

   PROCEDURE (VAR t: Trial) Try* (VAR par1, par2: ANYREC; IN par3: ANYREC), NEW;
   BEGIN
      trapCount := Kernel.trapCount;
      tryProc := S.VAL(TrySig, t.proc);
      par[0].par := S.ADR(par1); par[0].typ := S.TYP(par1);
      par[1].par := S.ADR(par2); par[1].typ := S.TYP(par2);
      par[2].par := S.ADR(par3); par[2].typ := S.TYP(par3);
      Kernel.Try(Do, 0, 0, 0);
      t.ok := Kernel.trapCount = trapCount;
      trapCount := Kernel.trapCount; (* для верхних Try *)
      IF ~t.ok THEN
         t.error := Kernel.err;
         t.pc := Kernel.pc;
      ELSE
         t.error := 0;
         t.pc := 0
      END
   END Try;

END omcRobust.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Модуль omcRobust - TRY-EXCEPT
СообщениеДобавлено: Суббота, 16 Ноябрь, 2013 22:40 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
Работает.
Код:
MODULE PrivTry;
   
   IMPORT
      omcRobust,
      Log;
      
   TYPE   
      Action* = ABSTRACT RECORD END;
      
      TestAction = RECORD (Action) END;
      
   VAR t: omcRobust.Trial;
   
   PROCEDURE (VAR a: Action) Try-, NEW, ABSTRACT;
   PROCEDURE (VAR a: Action) Except-, NEW, EMPTY;
   PROCEDURE (VAR a: Action) Finally-, NEW, EMPTY;
   
   PROCEDURE Try (VAR a, b: ANYREC; IN c: ANYREC);
   BEGIN
      WITH a: Action DO a.Try
      ELSE HALT(100) END;
   END Try;
      
   PROCEDURE Do* (VAR a: Action);   
   BEGIN
      t.Try(a, omcRobust.dummy, omcRobust.dummy);
      IF t.ok THEN
         a.Finally
      ELSE
         a.Except
      END;
   END Do;
   
   PROCEDURE (VAR a: TestAction) Try;
   BEGIN
      HALT(128); (* no trap win :) *)
   END Try;
   
   PROCEDURE (VAR a: TestAction) Except;
   BEGIN
      Log.String('except'); Log.Ln;
   END Except;
   
   PROCEDURE Test*;
      VAR a: TestAction;
   BEGIN
      Log.String('before'); Log.Ln;
      Do(a);
      Log.String('after'); Log.Ln;
   END Test;

BEGIN
   t.proc:=Try;   
END PrivTry.

PrivTry.Test


Последний раз редактировалось Пётр Кушнир Суббота, 16 Ноябрь, 2013 22:42, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Модуль omcRobust - TRY-EXCEPT
СообщениеДобавлено: Суббота, 16 Ноябрь, 2013 22:41 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
А ещё ведь есть тип Kernel.TrapCleaner


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB