OberonCore
https://forum.oberoncore.ru/

Модуль omcRobust - TRY-EXCEPT
https://forum.oberoncore.ru/viewtopic.php?f=47&t=4626
Страница 1 из 1

Автор:  Илья Ермаков [ Суббота, 16 Ноябрь, 2013 20:26 ]
Заголовок сообщения:  Модуль omcRobust - TRY-EXCEPT

Культурный, абстрагированная от 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.

Автор:  Пётр Кушнир [ Суббота, 16 Ноябрь, 2013 22:40 ]
Заголовок сообщения:  Re: Модуль omcRobust - TRY-EXCEPT

Работает.
Код:
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:41 ]
Заголовок сообщения:  Re: Модуль omcRobust - TRY-EXCEPT

А ещё ведь есть тип Kernel.TrapCleaner

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/