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