powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как правильно использовать $ETRAP
25 сообщений из 40, страница 1 из 2
Как правильно использовать $ETRAP
    #39104203
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно использовать $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.
,M9,                                                                            
End C                                                                           
End B                                                                           
End A                                                                           
End   

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

Код: plaintext
1.
2.
,M9,                                                                            
End A                                                                           
End   

Иными словами, как использовать обработчик ошибок для возврата на нужный мне уровень?
В данном случае на уровень процедуры A .
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104218
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фух... Экспериментальным путем получил желаемое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
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104223
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. получается следующее:
- Объявлять $etrap можно хоть в начале программы
- "сбрасывать" $etrap нужно на два уровня ниже уровня желаемого возврата
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104268
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это просто непонимание $etrap, в эту переменную просто нужно установить команду которая будет выполнена при срабатывании ошибки и все, и просто прерывается текущий стек.
есть еще $ztrap в данном случае выполнение происходит на уровне где переменная была объявлена. т.е. если в первом примере поставить
Код: plaintext
s $zt="ERROR"
то результат уже будет иной
Код: plaintext
1.
,M9,
End
тогда как, с $ztrap можно получить результат как с $etrap, уточнив что ошибку нужно обработать в месте ее срабатывания таким образом
Код: plaintext
s $zt="*ERROR"
и результат будет аналогичен как был с $etrap
Код: plaintext
1.
2.
3.
4.
,M9,
End C
End B
End A
End
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104371
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorэто просто непонимание $etrap
Ты так много написал, а пример так и не сделал... Каков твой вариант для нужного мне вывода?
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104379
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
,M9,
End A
End
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104427
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorесли нужно установить обработчик ошибок на том же уровне то try catch
Я разве про него спрашивал?
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104558
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaDAiMorесли нужно установить обработчик ошибок на том же уровне то try catch
Я разве про него спрашивал? Так если может задача стояла об установке обработчика на конкретном уровне, и так чтобы управление вернулось на тот же уровень, то только try catch, $etrap и $ztrap так эту задачу не решит, его нужно ниже уровнем опускать. Ошибка произошла и выполнение на данном уровне стека не может быть продолжена. а вот Try catch может, обрамить ошибку на одном уровне стека, и тут же продолжить выполнение после сбоя.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104580
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
,M9,                                                                            
val=3                                                                                                                                                           
End A                                                                           
End    

А нужно

Код: plaintext
val=5
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104587
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
val=5
Код: plaintext
1.
2.
3.
4.
5.
6.
,M9,
val=5
 
End C
End B
End A
End
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104601
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor , ты через строчку челе читаешь?

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

Код: plaintext
1.
2.
3.
,M9,                                                                            
val=5                                                                                                                                                           
End A                                                                           
End  
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104619
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
,M9,
val=5
 
End A
End
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104624
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что ты слишком рано чистишь $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
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104628
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovПеречитай "синего Кирстена", там $et-обработка разжёвана достаточно подробно.
Почитаю, она вроде у нас есть...
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104637
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa DAiMor , забудь про try catch. Я х/з как тебе еще сказать... Нет его.Обычно указывание $zv снимает подобного рода недоразумения.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104638
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov , с go to точно не пойдет...

Пока за рабочий вариант примем последний вариант от DAiMor . Спасибо за него.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104643
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorzquit 1Это так же не пойдет...

Т.ч. и вариантов пока нет.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104646
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле, костыль с "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 пользуемся, проблем никаких.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104648
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что в нашей задачке такое реализовано. Но пока никак не можем повторить отдельно на маленькой модели.

Там нет все ваших подходов. Но работает как нужно.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104657
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitkrvsa DAiMor , забудь про try catch. Я х/з как тебе еще сказать... Нет его.Обычно указывание $zv снимает подобного рода недоразумения.
Напишу так...
try catch есть но нужно сделать без него.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104661
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa, чем goto не угодила? Если "не кошерно", исправь в моем последнем варианте "g ERROR" на "d ERROR" и "$es>1" на "$es>2".

P.S. Плюс моего варианта в том, что он написан на стандартном M.
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104689
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
,M9,
val=3
End A
End

А нужно

Код: plaintext
1.
2.
3.
4.
,M9,
val=5
End A
End
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104691
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovПлюс моего варианта в том, что он написан на стандартном M.
Вот за чистоту и боремся...
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104754
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мсье знает толк в извращениях... С уровня стека ты ушёл? Ушёл. Значит и значение 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 никак, но тут уж "или шашечки, или ехать".
...
Рейтинг: 0 / 0
Как правильно использовать $ETRAP
    #39104885
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
,M9,
val=5
 
End A
End
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как правильно использовать $ETRAP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]