powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / генерация программ с обработкой ошибок
14 сообщений из 14, страница 1 из 1
генерация программ с обработкой ошибок
    #38435171
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня!

1.Генерирую программы из кода, который пользователь заносит в описание показателя.
Хотелось бы при этом выдавать ошибки в этом коде.
Поскольку работаю через CacheActiveX.Factory, написал вспомогательный класс и метод Compile в нем.
Программы-то генерируются, но и $ZTRAP, и $ETRAP не ловят ошибки копмиляции.
Может программы сохраняются без компиляции?
Или обработку ошибки надо внутрь xecute засунуть?Class OM.Utils Extends %RegisteredObject
{

ClassMethod DeleteObject(DOId As %String, DOClassName As %String) As %String
{
  set $ztrap="onerror"
  s x="##class("_DOClassName_").%DeleteId("_DOId_")"
  d @x
  quit ""
  
onerror
  set $ztrap=""
  quit "Error :"_$zerror
}

ClassMethod Compile(psource As %String, pname As %String) As %String
{
 
    set Delim=$c(13,10) 
    set nStr=$LENGTH(psource,Delim)
    
    k ^||rtn
    ;формируем заголовок
    set iline=1
    s ^||rtn(iline)=pname_" ;"
    set iline=iline+1
    s ^||rtn(iline)=" ;;сгенерировано проектом OM "_$zdt($h,3)_" версия 1 "
    set iline=iline+1
    s ^||rtn(iline)="  set $ztrap=""onerror"""
  set iline=iline+1
    s ^||rtn(iline)="  do log^OMutil("""_pname_""")"
    
    ;формируем тело программы
  for i=1:1:nStr do  ;
  .set iline=iline+1
  .set ^||rtn(iline)=$p(psource,Delim,i)

    ;формируем завершение
    set iline=iline+1
    s ^||rtn(iline)="  quit" ;форм нормальный выход    
    set iline=iline+1
    s ^||rtn(iline)="onerror ;"
  set iline=iline+1
    s ^||rtn(iline)="  set $ztrap="""""
  set iline=iline+1
    s ^||rtn(iline)="  set CurrError="""_pname_":""_$zerror"
    set iline=iline+1
    s ^||rtn(iline)="  quit" ;форм аварийный выход
      
  set formula="(pname) zr  x ""f i=1:1:"_iline_" zi ^||rtn(i) "" zs @pname"

  ;new $etrap
  ;set $etrap="goto onerror"
  set $ztrap="onerror"  
  set $zerror=""
  
  xecute (formula,pname)
  
  if $zerror'="" quit ("Error :"_$zerror)
  
  Quit "^"_pname   ;;возвращаемое методом значение
  
onerror
  set $ztrap=""
  quit "Error :"_$zerror
}

}
2.Кстати, в этом же классе у меня сидит метод DeleteObject. Не нашел в CacheActiveX.Factory метода для удаления объекта.
Это мне как-то странно.
Здесь на форуме промелькнул способ вызова произвольных М-программ с клиента (в моем случае, VBA), искал - но не нашел.
Напомните, пожалуйста. А то писать новый метод каждый раз кажется мне неправильным.
Да,
Cache for Windows (x86-32) 2010.1.2 (Build 600.0_SU) Tue May 25 2010 20:27:57 EDT
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435182
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR , это

Код: javascript
1.
2.
zi <строка>
zs <программа>


"Устаревший" синтаксис...

Используй класс %Library.Routine ... Там есть метод Compile() - он хоть статус вернет...
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435190
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRПрограммы-то генерируются, но и $ZTRAP, и $ETRAP не ловят ошибки копмиляции.
Может программы сохраняются без компиляции?
Или обработку ошибки надо внутрь xecute засунуть?
Код: javascript
1.
ZS


Пофиг что там и как, программа запишется... В МСМ дополнительная информация писалась в переменные $za, $zb, $zc...
А теперь если только смотреть исходники классового метода...
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435210
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR , вот так пиши  Set routine = ##class(%Routine).%New("MyRoutine.MAC")
  ; Write lines of code to the routine
  Do routine.WriteLine("MyRoutine")
  Do routine.WriteLine("Tag()")
  Do routine.WriteLine(" Write ""This is my routine"",!")
  Do routine.WriteLine(" Quit")
  ; save the routine
  Do routine.Save()
  ; compile the routine
  Set status=routine.Compile()
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435240
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,

Спасибо, попробую.

Прошу прощения за нахальство,:)
а на второй вопрос не подскажете?..
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435273
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDR ,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Set f = CreateObject("CacheActiveX.Factory")
If Not f.IsConnected() Then

  f.Connect("cn_iptcp:127.0.0.1[1972]:USER:_SYSTEM:SYS")

  f.Static("demo.test").SYS_DeleteId(1)

End If

PS: Работа с объектами СУБД Caché на примере Delphi
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435336
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При компиляции рутин результат выводится вроде как в текущее устройство. Их получать надо соответственно либо перехватом вывода http://karataev.nm.ru/cache/ioredir.html либо сделать текущим устройство типа спулер (тут есть http://karataev.nm.ru/cache/dco.html ) или файл, или использовать SetOutput (как вариант http://karataev.nm.ru/cache/setoutput.html ). Про SetOutput в старших версиях кажется даже в доке есть, и вроде как дополнительный ActiveX объект.
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435477
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,
а я все думал, куда DeleteId пристегнуть, оказывается к Static.
Про Static в "Using ActiveX with Caché" крайне мало написано.
И если в этом руководстве написано про New, OpenID и Save, то как-то странно не привести пример Delete.
К документации всегда можно придраться

Вы, наверное, знаете как выполнить произвольный код через CacheActiveX.Factory, например, вызвать произвольную программу, а не только чей-то метод. Поделитесь, плиз.

krvsa,

Set status=routine.Compile() - рулит!
Нормальная диагностика при компиляции сгенерированной программы.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
  	Set status=routine.Compile()
	
	set errstr=""		 
	I $$$ISERR(status) Do  ;
	.Do DecomposeStatus^%apiOBJ(status,.err,"-d")
	.F i=1:1:err set errstr=errstr_err(i)_"  "
	
	if errstr'="" quit errstr ;возвращаем ошибку
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435498
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я,
Код: sql
1.
При компиляции рутин результат выводится вроде как в текущее устройство.



Ладно, хоть на текущее устройство, хуже если бы вообще не выводился. Если приспичит, расковыряем. Спасибо, за ссылки.
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435513
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яПри компиляции рутин результат выводится вроде как в текущее устройство.Это легко отключить, например
set sc=routine.Compile("-d")
или так
set sc=routine.Compile("/displayerror=0 /displaylog=0")

ну яИх получать надо соответственно либо перехватом выводаНе нужно ничего перехватывать: возвращаемого статуса вполне достаточно.
Например:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
On Error Resume Next
Err.Clear

Set f = CreateObject("CacheActiveX.Factory")
f.Connect("cn_iptcp:127.0.0.1[1972]:USER:_SYSTEM:SYS")

Set routine=f.New("%Routine","MyRoutine.MAC")
routine.WriteLine("MyRoutine")
routine.WriteLine("Tag()")
routine.WriteLine(" Writ4 ""This is my routine"",!")
routine.WriteLine(" Quit")

routine.Save()

routine.Compile("-d")

If Err.Number <> 0 Then
  WScript.Echo " Код = " & Err.Number & vbCrLf & "Описание = " & Err.Description
  Err.Clear
End If


DirksDRВы, наверное, знаете как выполнить произвольный код через CacheActiveX.Factory, например, вызвать произвольную программу, а не только чей-то метод. CacheActiveX.Factory рассчитан на работу с классами/объектами, а не программами или глобалами, для которых есть VisM .
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435554
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirksDRВы, наверное, знаете как выполнить произвольный код через CacheActiveX.Factory, например, вызвать произвольную программу, а не только чей-то метод.
servit CacheActiveX.Factory рассчитан на работу с классами/объектами, а не программами или глобалами, для которых есть VisM .
И ничто не мешает написать класс-обертку, который должен будет DirksDR вызвать произвольную программу
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435560
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintИ ничто не мешает написать класс-обертку, который должен будетКак я понял, вот этого ТС и не хотел бы делать.
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435596
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше бы ТС этого захотел, ибо простое решение через VisM/%Service_CacheDirect может в дальнейшем обернуться проблемами, связанными с необходимостью соединяться с Cache через 2 сервиса - %Service_Bindings и %Service_CacheDirect.
...
Рейтинг: 0 / 0
генерация программ с обработкой ошибок
    #38435720
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

VisM - хорошая штука, но говорят устарел. К тому же я худо-бедно научился работать через сокет.

Но там, где я работаю через CacheActiveX.Factory, не хотелось второй интерфейс и второй коннект открывать.
Пожалуй, использую обертки Каратаева Е.:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
ClassMethod Read(What As %String) As %String
{
   q @What
}
ClassMethod Execute(What As %String)
{
   x What
}


Спасибо всем за советы и обсуждение!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / генерация программ с обработкой ошибок
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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