Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Как правильно использовать $ETRAP для получения нужного эффекта?
Вот программка
tmp 
  
A
  
!,"End"
  
q
A
  
s $et="d ERROR"
  
B
  
!,"End A"
  
q
B
  
C
  
!,"End B"
  
q
C
  
D
  
!,"End C"
  
q
D
  
1/0
  
!,"End D"
  
q
ERROR
  
!,$ec
  s $ec
=""
  
q
При запуске получаю вывод на экран

,M9,                                                                            
End C
End B
End A
End

А хотелось бы получить

,M9,                                                                            
End A
End

Иными словами, как использовать обработчик ошибок для возврата на нужный мне уровень?
В данном случае на уровень процедуры A.
16 ноя 15, 11:13    [18422482]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Фух... Экспериментальным путем получил желаемое
tmp 
  
n $et
  s $et
="d ERROR"
  
A
  
!,"End"
  
q
A
  
B
  
!,"End A"
  
q
B
  
C
  
!,"End B"
  
q
C
  
n $et
  s $et
=""
  
D
  
!,"End C"
  
q
D
  
1/0
  
!,"End D"
  
q
ERROR
  
!,$ec
  s $ec
=""
  
q
16 ноя 15, 11:27    [18422589]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Т.е. получается следующее:
- Объявлять $etrap можно хоть в начале программы
- "сбрасывать" $etrap нужно на два уровня ниже уровня желаемого возврата
16 ноя 15, 11:30    [18422606]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2675
это просто непонимание $etrap, в эту переменную просто нужно установить команду которая будет выполнена при срабатывании ошибки и все, и просто прерывается текущий стек.
есть еще $ztrap в данном случае выполнение происходит на уровне где переменная была объявлена. т.е. если в первом примере поставить
s $zt="ERROR"
то результат уже будет иной
,M9,
End
тогда как, с $ztrap можно получить результат как с $etrap, уточнив что ошибку нужно обработать в месте ее срабатывания таким образом
s $zt="*ERROR"
и результат будет аналогичен как был с $etrap
,M9,
End C
End B
End A
End
16 ноя 15, 11:58    [18422824]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
DAiMor
это просто непонимание $etrap

Ты так много написал, а пример так и не сделал... Каков твой вариант для нужного мне вывода?
16 ноя 15, 13:07    [18423223]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2675
krvsa
DAiMor
это просто непонимание $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
даст такой результат

,M9,
End A
End
16 ноя 15, 13:13    [18423279]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
DAiMor
если нужно установить обработчик ошибок на том же уровне то try catch

Я разве про него спрашивал?
16 ноя 15, 13:39    [18423493]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2675
krvsa
DAiMor
если нужно установить обработчик ошибок на том же уровне то try catch

Я разве про него спрашивал?
Так если может задача стояла об установке обработчика на конкретном уровне, и так чтобы управление вернулось на тот же уровень, то только try catch, $etrap и $ztrap так эту задачу не решит, его нужно ниже уровнем опускать. Ошибка произошла и выполнение на данном уровне стека не может быть продолжена. а вот Try catch может, обрамить ошибку на одном уровне стека, и тут же продолжить выполнение после сбоя.
16 ноя 15, 14:59    [18424135]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
DAiMor, забудь про try catch. Я х/з как тебе еще сказать... Нет его.

Как вернуться на нужный мне уровень я уже показал своим примером.
Но там подключается другая проблема... Я не получаю нужных мне переменных "окружения".
test
  
n
  s $et
="d ERROR"
  
val=1
  
A
  
!,"End"
  
q
A
  
val
  
val=2
  
B
  
!,"End A"
  
q
B
  
val
  
val=3
  
C
  
!,"End B"
  
q
C
  
val,$et
  s $et
=""
  
val=4
  
D
  
!,"End C"
  
q
D
  
val
  
val=5
  
1/0
  
!,"End D"
  
q
ERROR
  
!,$ec,!
  
zw val
  
s $ec=""
  
q
Вывод на экран

,M9,                                                                            
val=3
End A
End

А нужно

val=5
16 ноя 15, 15:24    [18424308]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2675
test
  
n
  s $zt
="*ERROR"
  
val=1
  
A
  
!,"End"
  
q
A
  
val
  
val=2
  
B
  
!,"End A"
  
q
B
  
val
  
val=3
  
C
  
!,"End B"
  
q
C
  
val,$et
  s $et
=""
  
val=4
  
D
  
!,"End C"
  
q
D
  
val
  
val=5
  
1/0
  
!,"End D"
  
q
ERROR
  
!,$ec,!
  
zw val
  
s $ec=""
  
q
krvsa
А нужно

val=5
,M9,
val=5

End C
End B
End A
End
16 ноя 15, 15:34    [18424361]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
DAiMor, ты через строчку челе читаешь?

Мне нужен вывод

,M9,                                                                            
val=5
End A
End
16 ноя 15, 15:55    [18424508]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2675
test
  
n
  s 
val=1
  
A
  
!,"End"
  
q
A
  
val
  
val=2
  
B
  
!,"End A"
  
q
B
  
val
  
s $zt="*ERROR"
  
val=3
  
C
  
!,"End B"
  
q
C
  
val
  
val=4
  
D
  
!,"End C"
  
q
D
  
val
  
val=5
  
1/0
  
!,"End D"
  
q
ERROR
  
!,$ec,!
  
zw val
  
s $ec=""
  
zquit 1
  
q
,M9,
val=5

End A
End
16 ноя 15, 16:07    [18424589]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
Проблема в том, что ты слишком рано чистишь $ec. Как только ты это сделал, обработка ошибок закончена. Нужен контроль $estack. Перечитай "синего Кирстена", там $et-обработка разжёвана достаточно подробно.
tmp 
  
A
  
!,"End"
  
q
A
  
new $et,$es set $ec=""
  
s $et="g ERROR"
  
B
Afinita
  
!,"End A"
  
q
B
  
C
  
!,"End B"
  
q
C
  
D
  
!,"End C"
  
q
D
  
1/0
  
!,"End D"
  
q
ERROR
  
q:$es>0
  
!,$ec
  s $ec
=""
  
Afinita
16 ноя 15, 16:10    [18424615]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Alexey Maslov
Перечитай "синего Кирстена", там $et-обработка разжёвана достаточно подробно.

Почитаю, она вроде у нас есть...
16 ноя 15, 16:12    [18424632]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
krvsa
DAiMor, забудь про try catch. Я х/з как тебе еще сказать... Нет его.
Обычно указывание $zv снимает подобного рода недоразумения.
16 ноя 15, 16:16    [18424675]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Alexey Maslov, с go to точно не пойдет...

Пока за рабочий вариант примем последний вариант от DAiMor. Спасибо за него.
16 ноя 15, 16:17    [18424680]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
DAiMor
zquit 1
Это так же не пойдет...

Т.ч. и вариантов пока нет.
16 ноя 15, 16:19    [18424700]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
На самом деле, костыль с "g Afinita" лишний: надо просто завершить обработку ошибки на уровне $estack=1.
tmp 
  
A
  
!,"End"
  
q
A
  
new $et,$es set $ec=""
  
s $et="g ERROR"
  
B
  
!,"End A"
  
q
B
  
C
  
!,"End B"
  
q
C
  
D
  
!,"End C"
  
q
D
  
1/0
  
!,"End D"
  
q
ERROR
  
q:$es>1
  
!,$ec
  s $ec
=""
  
q
Вообще, механизм $et, на мой взгляд, весьма мощный и позволяет делать всё, что умеет $zt, и даже много больше. При этом лишён странных ограничений try/catch: почему, например, нельзя делать quit из catch-блока?
ИМХО, зря ISC, гонясь за модой, практически убрала $et под сукно и даже почему-то не рекомендует ей пользоваться. С Cache 4.1 по Cache 2015.1 пользуемся, проблем никаких.
16 ноя 15, 16:20    [18424710]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Дело в том, что в нашей задачке такое реализовано. Но пока никак не можем повторить отдельно на маленькой модели.

Там нет все ваших подходов. Но работает как нужно.
16 ноя 15, 16:21    [18424716]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
servit
krvsa
DAiMor, забудь про try catch. Я х/з как тебе еще сказать... Нет его.
Обычно указывание $zv снимает подобного рода недоразумения.

Напишу так...
try catch есть но нужно сделать без него.
16 ноя 15, 16:25    [18424747]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
krvsa, чем goto не угодила? Если "не кошерно", исправь в моем последнем варианте "g ERROR" на "d ERROR" и "$es>1" на "$es>2".

P.S. Плюс моего варианта в том, что он написан на стандартном M.
16 ноя 15, 16:28    [18424769]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Alexey Maslov
чем goto не угодила?

Взял твой последний пример...
tmp 
  
val
  
val=1
  
A
  
!,"End"
  
q
A
  
new $et,$es,val
  
set $ec=""
  
val=2
  
s $et="g ERROR"
  
B
  
!,"End A"
  
q
B
  
val
  
val=3
  
C
  
!,"End B"
  
q
C
  
val
  
val=4
  
D
  
!,"End C"
  
q
D
  
val
  
val=5
  
1/0
  
!,"End D"
  
q
ERROR
  
q:$es>1
  
!,$ec,!
  
zw val
  
s $ec=""
  
q
Вывод

,M9,
val=3
End A
End

А нужно

,M9,
val=5
End A
End
16 ноя 15, 16:42    [18424901]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13153
Alexey Maslov
Плюс моего варианта в том, что он написан на стандартном M.

Вот за чистоту и боремся...
16 ноя 15, 16:43    [18424910]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1554
Мсье знает толк в извращениях... С уровня стека ты ушёл? Ушёл. Значит и значение val видишь действующее на том уровне, где ты оказался. Однако можно добиться того, что ты хочешь, примерно так:
tmp 
  
val,zzzsave,zzzname
  
val=1
  
A
  
!,"End"
  
q
A
  
new $et,$es set $ec=""
  
s $et="g ERROR"
  
val val=2
  
B
  
!,"End A"
  
q
B
  
val val=3
  
C
  
!,"End B"
  
q
C
  
val val=4
  
D
  
!,"End C"
  
q
D
  
val val=5
  
1/0
  
!,"End D"
  
q
ERROR
  
if $st=$st(-1) for zzzname="val" merge zzzsave($st,zzzname)=@zzzname ; сохраняем интересующий контекст на данном уровне
  
q:$es>1
  
!,$ec
  for 
zzzname="val" @zzzname=zzzsave($st(-1),zzznamezw @zzzname ; восстанавливаем сохраненный контекст
  
s $ec=""
  
q

P.S. Здесь уже без goto никак, но тут уж "или шашечки, или ехать".
16 ноя 15, 17:16    [18425139]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать $ETRAP  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
krvsa,
tmp 
  
val=1
  
A
  
!,"End"
  
q
A
  
val=2
  
B
  
!,"End A"
  
q
B
  
s $zt="ERROR"
  
val=3
  
C
  
!,"End B"
  
q
C
  
val=4
  
D
  
!,"End C"
  
q
D
  
val=5
  
1/0
  
!,"End D"
  
q
ERROR
  
!,$ec,!
  
zw val
  
s $zt=""
  
s $ze=""
  
s $ec=""
  
q
,M9,
val=5

End A
End
16 ноя 15, 18:41    [18425703]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить