|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Как правильно использовать $ETRAP для получения нужного эффекта? Вот программкаtmp d A w !,"End" q A s $et="d ERROR" d B w !,"End A" q B d C w !,"End B" q C d D w !,"End C" q D w 1/0 w !,"End D" q ERROR w !,$ec s $ec="" qПри запуске получаю вывод на экран Код: plaintext 1. 2. 3. 4. 5.
А хотелось бы получить Код: plaintext 1. 2.
Иными словами, как использовать обработчик ошибок для возврата на нужный мне уровень? В данном случае на уровень процедуры A . ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 11:13 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Фух... Экспериментальным путем получил желаемоеtmp n $et s $et="d ERROR" d A w !,"End" q A d B w !,"End A" q B d C w !,"End B" q C n $et s $et="" d D w !,"End C" q D w 1/0 w !,"End D" q ERROR w !,$ec s $ec="" q ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 11:27 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Т.е. получается следующее: - Объявлять $etrap можно хоть в начале программы - "сбрасывать" $etrap нужно на два уровня ниже уровня желаемого возврата ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 11:30 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
это просто непонимание $etrap, в эту переменную просто нужно установить команду которая будет выполнена при срабатывании ошибки и все, и просто прерывается текущий стек. есть еще $ztrap в данном случае выполнение происходит на уровне где переменная была объявлена. т.е. если в первом примере поставить Код: plaintext
Код: plaintext 1.
Код: plaintext
Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 11:58 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
DAiMorэто просто непонимание $etrap Ты так много написал, а пример так и не сделал... Каков твой вариант для нужного мне вывода? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 13:07 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
krvsaDAiMorэто просто непонимание $etrap Ты так много написал, а пример так и не сделал... Каков твой вариант для нужного мне вывода? если нужно установить обработчик ошибок на том же уровне то try catch либо нужно устанваливать ниже по стекуtmp do A write !,"End" quit A try { do B } catch err { write !,$ecode set $ecode="" } write !,"End A" quit B do C write !,"End B" quit C do D write !,"End C" quit D write 1/0 write !,"End D" quitдаст такой результат Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 13:13 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
DAiMorесли нужно установить обработчик ошибок на том же уровне то try catch Я разве про него спрашивал? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 13:39 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
krvsaDAiMorесли нужно установить обработчик ошибок на том же уровне то try catch Я разве про него спрашивал? Так если может задача стояла об установке обработчика на конкретном уровне, и так чтобы управление вернулось на тот же уровень, то только try catch, $etrap и $ztrap так эту задачу не решит, его нужно ниже уровнем опускать. Ошибка произошла и выполнение на данном уровне стека не может быть продолжена. а вот Try catch может, обрамить ошибку на одном уровне стека, и тут же продолжить выполнение после сбоя. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 14:59 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
DAiMor , забудь про try catch. Я х/з как тебе еще сказать... Нет его. Как вернуться на нужный мне уровень я уже показал своим примером. Но там подключается другая проблема... Я не получаю нужных мне переменных "окружения".test n s $et="d ERROR" s val=1 d A w !,"End" q A n val s val=2 d B w !,"End A" q B n val s val=3 d C w !,"End B" q C n val,$et s $et="" s val=4 d D w !,"End C" q D n val s val=5 w 1/0 w !,"End D" q ERROR w !,$ec,! zw val s $ec="" qВывод на экран Код: plaintext 1. 2. 3. 4.
А нужно Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 15:24 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
test n s $zt="*ERROR" s val=1 d A w !,"End" q A n val s val=2 d B w !,"End A" q B n val s val=3 d C w !,"End B" q C n val,$et s $et="" s val=4 d D w !,"End C" q D n val s val=5 w 1/0 w !,"End D" q ERROR w !,$ec,! zw val s $ec="" qkrvsaА нужно Код: plaintext
Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 15:34 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
DAiMor , ты через строчку челе читаешь? Мне нужен вывод Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 15:55 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
test n s val=1 d A w !,"End" q A n val s val=2 d B w !,"End A" q B n val s $zt="*ERROR" s val=3 d C w !,"End B" q C n val s val=4 d D w !,"End C" q D n val s val=5 w 1/0 w !,"End D" q ERROR w !,$ec,! zw val s $ec="" zquit 1 q Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:07 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Проблема в том, что ты слишком рано чистишь $ec. Как только ты это сделал, обработка ошибок закончена. Нужен контроль $estack. Перечитай "синего Кирстена", там $et-обработка разжёвана достаточно подробно.tmp d A w !,"End" q A new $et,$es set $ec="" s $et="g ERROR" d B Afinita w !,"End A" q B d C w !,"End B" q C d D w !,"End C" q D w 1/0 w !,"End D" q ERROR q:$es>0 w !,$ec s $ec="" g Afinita ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:10 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Alexey MaslovПеречитай "синего Кирстена", там $et-обработка разжёвана достаточно подробно. Почитаю, она вроде у нас есть... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:12 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
krvsa DAiMor , забудь про try catch. Я х/з как тебе еще сказать... Нет его.Обычно указывание $zv снимает подобного рода недоразумения. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:16 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Alexey Maslov , с go to точно не пойдет... Пока за рабочий вариант примем последний вариант от DAiMor . Спасибо за него. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:17 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
DAiMorzquit 1Это так же не пойдет... Т.ч. и вариантов пока нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:19 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
На самом деле, костыль с "g Afinita" лишний: надо просто завершить обработку ошибки на уровне $estack=1.tmp d A w !,"End" q A new $et,$es set $ec="" s $et="g ERROR" d B w !,"End A" q B d C w !,"End B" q C d D w !,"End C" q D w 1/0 w !,"End D" q ERROR q:$es>1 w !,$ec s $ec="" qВообще, механизм $et, на мой взгляд, весьма мощный и позволяет делать всё, что умеет $zt, и даже много больше. При этом лишён странных ограничений try/catch: почему, например, нельзя делать quit из catch-блока? ИМХО, зря ISC, гонясь за модой, практически убрала $et под сукно и даже почему-то не рекомендует ей пользоваться. С Cache 4.1 по Cache 2015.1 пользуемся, проблем никаких. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:20 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Дело в том, что в нашей задачке такое реализовано. Но пока никак не можем повторить отдельно на маленькой модели. Там нет все ваших подходов. Но работает как нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:21 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
servitkrvsa DAiMor , забудь про try catch. Я х/з как тебе еще сказать... Нет его.Обычно указывание $zv снимает подобного рода недоразумения. Напишу так... try catch есть но нужно сделать без него. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:25 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
krvsa, чем goto не угодила? Если "не кошерно", исправь в моем последнем варианте "g ERROR" на "d ERROR" и "$es>1" на "$es>2". P.S. Плюс моего варианта в том, что он написан на стандартном M. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:28 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Alexey Maslovчем goto не угодила? Взял твой последний пример...tmp n val s val=1 d A w !,"End" q A new $et,$es,val set $ec="" s val=2 s $et="g ERROR" d B w !,"End A" q B n val s val=3 d C w !,"End B" q C n val s val=4 d D w !,"End C" q D n val s val=5 w 1/0 w !,"End D" q ERROR q:$es>1 w !,$ec,! zw val s $ec="" qВывод Код: plaintext 1. 2. 3. 4.
А нужно Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:42 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Alexey MaslovПлюс моего варианта в том, что он написан на стандартном M. Вот за чистоту и боремся... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 16:43 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Мсье знает толк в извращениях... С уровня стека ты ушёл? Ушёл. Значит и значение val видишь действующее на том уровне, где ты оказался. Однако можно добиться того, что ты хочешь, примерно так:tmp n val,zzzsave,zzzname s val=1 d A w !,"End" q A new $et,$es set $ec="" s $et="g ERROR" n val s val=2 d B w !,"End A" q B n val s val=3 d C w !,"End B" q C n val s val=4 d D w !,"End C" q D n val s val=5 w 1/0 w !,"End D" q ERROR if $st=$st(-1) for zzzname="val" merge zzzsave($st,zzzname)=@zzzname ; сохраняем интересующий контекст на данном уровне q:$es>1 w !,$ec for zzzname="val" s @zzzname=zzzsave($st(-1),zzzname) zw @zzzname ; восстанавливаем сохраненный контекст s $ec="" q P.S. Здесь уже без goto никак, но тут уж "или шашечки, или ехать". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 17:16 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
krvsa ,tmp s val=1 d A w !,"End" q A s val=2 d B w !,"End A" q B s $zt="ERROR" s val=3 d C w !,"End B" q C s val=4 d D w !,"End C" q D s val=5 w 1/0 w !,"End D" q ERROR w !,$ec,! zw val s $zt="" s $ze="" s $ec="" q Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2015, 18:41 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
servit, зачем преумножать сущности и привлекать нестандартные переменные, когда вполне можно обойтись стандартом? ТС $zv не указал, значит возможно код пишется не только под Каше, а $zt-обработка в каждом MUMPSe своя. К тому же $et (потенциально) функционально богаче, чем $zt. Например, если убрать проверку в строке ERROR+1, получаем прототип обработчика, сохраняющего контекст на всех пройденных уровнях стека. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 01:12 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Alexey Maslovзначит возможно код пишется не только под Каше Да. Нужно сделать для разных версий Кащея и под GT.M... Но повторюсь, у нас сейчас это работает. Но проклятый нидзя-код (используется только $et) пока не удается разобрать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 08:14 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
servit Код: plaintext 1. 2. 3. 4.
n val А это уже не то, что нужно... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 08:32 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Смог таки разобраться в том нидзя-коде. Вот как можно все организоватьtmp n STARTMENU f q:'$$iteration q iteration() n prc s $et="d ERROR" S $ec="" w !!,"Menu",! w !,1," test" w !,2," exit" w !! r case q:case'=1 0 s prc="A^tmp" d @prc w !,"End" q 1 A n val s val=1 d B w !,"End A" q B n val s val=2 d C w !,"End B" q C n val s val=3 w 1/0 q ERROR s $et="" w ! zw val s $et="d ERR" q ERR q:$st($st-3,"PLACE")'["STARTMENU+1^tmp" s $et="d ERROR" s $ec="" qВ этом случае вы получаете нужное значение переменных. А второй обработчик позволяет вывести на нужный уровень стека. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 09:52 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Спасибо всем, кто откликнулся на проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 10:09 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Много лишнего кода. Второй обработчик только ради того, чтобы пропустить 2 строчки первого? Привязка к конкретным меткам (потеря универсальности) вместо простой проверки $estack? Впрочем все это ИМХО, главное, что тебе твой вариант нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 10:46 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Alexey MaslovМного лишнего кода. Это для пущей наглядности. :)) Поскольку во всех книжках как раз кода кот наплакал и ниже второго уровня никто примеров не дает. А тут полная эмуляция нашей (по крайней мере) задачи. Alexey MaslovВторой обработчик только ради того, чтобы пропустить 2 строчки первого? Не совсем понял про строчки... Второй обработчик выводит на нужный уровень стека для "возврата" в нужное место программы. Alexey MaslovПривязка к конкретным меткам (потеря универсальности) вместо простой проверки $estack? Это как частный случай... Т.с. для простоты и иллюстрации. Как выводить на нужный уровень стека каждый может решить для себя самостоятельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 11:24 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Вот вариант с $es...tmp n f q:'$$iteration q iteration() n $es,prc s $et="d ERROR" S $ec="" w !!,"Menu",! w !,1," test" w !,2," exit" w !! r case w ! q:case'=1 0 s prc="A^tmp" d @prc w !,"End" q 1 A n val s val=1 d B w !,"End A" q B n val s val=2 d C w !,"End B" q C n val s val=3 w 1/0 q ERROR s $et="" zw val s $et="d ERR" q ERR q:$es>2 s $et="d ERROR" s $ec="" q ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 11:34 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
krvsaservit Код: plaintext 1. 2. 3. 4.
n val А это уже не то, что нужно... s $et="d ERROR" tmp n val s val=1 d A w !,"End" q A n val s val=2 d B w !,"End A" q B n val s val=3 d C w !,"End B" q C n val s val=4 d D w !,"End C" q D n val s val=5 w 1/0 w !,"End D" q ERROR if $st($st(-1),"ECODE")="" { w !,$ec,! zw val } s:$st=4 $ec="" q ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 12:10 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
servit s:$st=4 $ec=""Или так: s:$st($st,"PLACE")["C+" $ec="" ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 12:22 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
servit , нас полностью устраивает наш последний вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 13:41 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Есть черновик статьи про обработку ошибок в Каше. ISC отказала в ее публикации на хабре, но если "народу интересно", можно поискать другое место. Материал родился в результате попыток объяснить коллегам, как работает $et и чем отличается от $zt. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2015, 13:53 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
Нужный эффект, правда не в каше, но это, думаю не важно, можно получить (из своего опыта) переопределением в обработчике ошибки переменной $et.ERROR ;делаем то что надо на уровне возникновения ошибки ;а затем: s $et="i '$es s $ec=""""" ;это позволит подняться до нужного уровня (там, где заньючили $es и т.д.) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2015, 15:55 |
|
Как правильно использовать $ETRAP
|
|||
---|---|---|---|
#18+
gluconat_caНужный эффект, правда не в каше, но это, думаю не важно В Caché Ваш вариант тоже работает: s $et="d ERROR" tmp n val s val=1 d A w !,"End" q A n val s val=2 d B w !,"End A" q B n val,$es s val=3 d C w !,"End B" q C n val s val=4 d D w !,"End C" q D n val s val=5 w 1/0 w !,"End D" q ERROR w !,$ec,! zw val s $et="s:'$es $ec=""""" q Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2015, 16:27 |
|
|
start [/forum/topic.php?all=1&fid=39&tid=1556569]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 288ms |
total: | 436ms |
0 / 0 |