|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
Всем доброго дня! 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 11:01 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
DirksDR , это Код: javascript 1. 2.
"Устаревший" синтаксис... Используй класс %Library.Routine ... Там есть метод Compile() - он хоть статус вернет... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 11:12 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
DirksDRПрограммы-то генерируются, но и $ZTRAP, и $ETRAP не ловят ошибки копмиляции. Может программы сохраняются без компиляции? Или обработку ошибки надо внутрь xecute засунуть? Код: javascript 1.
Пофиг что там и как, программа запишется... В МСМ дополнительная информация писалась в переменные $za, $zb, $zc... А теперь если только смотреть исходники классового метода... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 11:18 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
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() ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 11:35 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
krvsa, Спасибо, попробую. Прошу прощения за нахальство,:) а на второй вопрос не подскажете?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 11:58 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
DirksDR , Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
PS: Работа с объектами СУБД Caché на примере Delphi ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 12:12 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
При компиляции рутин результат выводится вроде как в текущее устройство. Их получать надо соответственно либо перехватом вывода http://karataev.nm.ru/cache/ioredir.html либо сделать текущим устройство типа спулер (тут есть http://karataev.nm.ru/cache/dco.html ) или файл, или использовать SetOutput (как вариант http://karataev.nm.ru/cache/setoutput.html ). Про SetOutput в старших версиях кажется даже в доке есть, и вроде как дополнительный ActiveX объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 12:42 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 13:46 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
ну я, Код: sql 1.
Ладно, хоть на текущее устройство, хуже если бы вообще не выводился. Если приспичит, расковыряем. Спасибо, за ссылки. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 13:57 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
ну яПри компиляции рутин результат выводится вроде как в текущее устройство.Это легко отключить, например 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.
DirksDRВы, наверное, знаете как выполнить произвольный код через CacheActiveX.Factory, например, вызвать произвольную программу, а не только чей-то метод. CacheActiveX.Factory рассчитан на работу с классами/объектами, а не программами или глобалами, для которых есть VisM . ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 14:04 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
DirksDRВы, наверное, знаете как выполнить произвольный код через CacheActiveX.Factory, например, вызвать произвольную программу, а не только чей-то метод. servit CacheActiveX.Factory рассчитан на работу с классами/объектами, а не программами или глобалами, для которых есть VisM . И ничто не мешает написать класс-обертку, который должен будет DirksDR вызвать произвольную программу ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 14:26 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
doublefintИ ничто не мешает написать класс-обертку, который должен будетКак я понял, вот этого ТС и не хотел бы делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 14:30 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
Лучше бы ТС этого захотел, ибо простое решение через VisM/%Service_CacheDirect может в дальнейшем обернуться проблемами, связанными с необходимостью соединяться с Cache через 2 сервиса - %Service_Bindings и %Service_CacheDirect. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 14:50 |
|
генерация программ с обработкой ошибок
|
|||
---|---|---|---|
#18+
servit, VisM - хорошая штука, но говорят устарел. К тому же я худо-бедно научился работать через сокет. Но там, где я работаю через CacheActiveX.Factory, не хотелось второй интерфейс и второй коннект открывать. Пожалуй, использую обертки Каратаева Е.: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Спасибо всем за советы и обсуждение! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2013, 15:49 |
|
|
start [/forum/topic.php?fid=39&msg=38435336&tid=1557041]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
168ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 285ms |
0 / 0 |