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/ |