|
Как правильно использовать $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 |
|
|
start [/forum/topic.php?fid=39&msg=39104657&tid=1556569]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 285ms |
total: | 419ms |
0 / 0 |