powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обработка ошибок
20 сообщений из 20, страница 1 из 1
Обработка ошибок
    #35535103
bn1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть три метода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
ClassMethod Error(Message As %String) As %String
{
 n $ETRAP
 set $ETRAP="s $ZERROR="""_$G(Message)_""""  set $ECODE=",Uerror,"
}


ClassMethod ReturnSQLResultSet(Sql As %String) As %Library.ResultSet
{
 n SQLCODE,result
 s OLDZTRAP =$ZTRAP, $ZTRAP ="ERR1"

 s result =##class(%Library.ResultSet).%New()
 if result.Prepare(Sql) if result.Execute() Quit result
 if (SQLCODE <  0 ) {
ERR1	 
    d result.Close() k result  s $ZTRAP = OLDZTRAP
    set CODETEXT = $SYSTEM.SQL.SQLCODE(SQLCODE)
    do ..Error("Error "_SQLCODE_": "_CODETEXT_";\nSQL: "_Sql)
 }
}

ClassMethod Exec(Sql As %String, Value As %String =  0 ) As %String
{
 n result s result = ..ReturnSQLResultSet(Sql)
 n return s return = ""
 s OLDZTRAP =$ZTRAP, $ZTRAP ="ERR2"
 if (SQLCODE <  0 ) {
ERR2	 
    d result.Close() k result  s $ZTRAP = OLDZTRAP
    set CODETEXT = $SYSTEM.SQL.SQLCODE(SQLCODE)
    do ..Error("Error "_SQLCODE_": "_CODETEXT_";\nSQL: "_Sql)
    q ""
 }
 s Val = $G(Value) if (Val =  0 )!(Val = "") set return = ""
 if result.Next() set return = $G(result.Data(Val))  
 d result.Close() k result  s $ZTRAP = OLDZTRAP Q return
 
}

Если вызвать метод Exec таким образом:
Код: plaintext
1.
2.
3.
 s TTN = "ewrtwert" // не существует
 s sql = "DELETE FROM "_TTN_" WHERE IDDOC = "_IDDOC_ " and META_TABLES = "_TABLEID 
 do ##class(User.CustomDocument).Exec(sql)

то вместо ожидаемого кода ошибки выдает сообщение COMMAND и имя функции Exec,
если же строку s OLDZTRAP =$ZTRAP, $ZTRAP ="ERR2"
в Exec поставить наверх приложение совсем виснет.

С чем это может быть связано?
...
Рейтинг: 0 / 0
Обработка ошибок
    #35535472
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия каше то какая ?

Уже с 5.0.x "рекомендуется" вместо конструкции
Код: plaintext
1.
2.
3.
 set oldtrat=$ZT,$ZT="NewTrap"
NewTrap
 set $ZT=oldtrat
использовать
Код: plaintext
1.
2.
3.
 set $ZT="NewTrap"
NewTrap
 set $ZT=""
ибо $ZT в стеке запоминаеться

Ну и функция Error странно выклядить - на кой устанавливать альтернативный к $ZTRAPобработчик $ETRAP или может быть имелось в виду $ECODE?

Ну а комманд думаю генериться потому что в случае неудачи из ReturnSQLResultSet ничего не возращается - quit <value> нет
...
Рейтинг: 0 / 0
Обработка ошибок
    #35535497
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка COMMAND, вроде, возникает при невозвращении значения методом, если вы требуете от него результата выполнения (тобишь функция ни чего не возвращает). На сколько я понимаю, при возникновении ошибки вы просто обрываете метод без возвращения значения. Возвращайте лучше $$$NULLOREF или пустой ResultSet.
...
Рейтинг: 0 / 0
Обработка ошибок
    #35535512
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы написал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
ClassMethod Error(Message As %String) As %Status
{
 n $ETRAP
 set $ETRAP="s $ZERROR="""_$G(Message)_""""  set $ECODE=",Uerror,"
 q $$$OK
}

ClassMethod ReturnSQLResultSet(Sql As %String) As %Library.ResultSet
{
 n SQLCODE,result
 s OLDZTRAP =$ZTRAP, $ZTRAP ="ERR1"

 s result =##class(%Library.ResultSet).%New()
 s sc=result.Prepare(Sql)
 if $$$ISERR(sc) { d ..Error("Error "_$System.Status.DecomposeStatus(sc)) q $$$NULLOREF}
 s sc=result.Execute()
 if $$$ISERR(sc) { d ..Error("Error "_$System.Status.DecomposeStatus(sc)) q $$$NULLOREF}
 if SQLCODE <  0  {
    ERR1	 
    d result.Close() k result  s $ZTRAP = OLDZTRAP
    set CODETEXT = $SYSTEM.SQL.SQLCODE(SQLCODE)
    d ..Error("Error "_SQLCODE_": "_CODETEXT_";\nSQL: "_Sql)
    q $$$NULLOREF
 }
 q result
}

ClassMethod Exec(Sql As %String, Value As %String =  0 ) As %String
{
 s return = "" 
 s result = ..ReturnSQLResultSet(Sql)
 if $IsObject(result) {
    s OLDZTRAP =$ZTRAP, $ZTRAP ="ERR2"
    if (SQLCODE =  0 ) {
       s Val = $G(Value) if (Val =  0 )!(Val = "") set return = ""
       if result.Next() set return = $G(result.Data(Val))  
       d result.Close() k result  s $ZTRAP = OLDZTRAP 
    } else {
    ERR2	 
       d result.Close() k result  s $ZTRAP = OLDZTRAP
       set CODETEXT = $SYSTEM.SQL.SQLCODE(SQLCODE)
       do ..Error("Error "_SQLCODE_": "_CODETEXT_";\nSQL: "_Sql)
    }    
 }
 q return
}
...
Рейтинг: 0 / 0
Обработка ошибок
    #35535742
bn1978
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия 5.012

В этом месте SQLCODE 100 тоже попадает под исключение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    if (SQLCODE =  0 ) {
       s Val = $G(Value) if (Val =  0 )!(Val = "") set return = ""
       if result.Next() set return = $G(result.Data(Val))  
       d result.Close() k result  s $ZTRAP = OLDZTRAP 
    } else {
    ERR2	 
       d result.Close() k result  s $ZTRAP = OLDZTRAP
       set CODETEXT = $SYSTEM.SQL.SQLCODE(SQLCODE)
       do ..Error("Error "_SQLCODE_": "_CODETEXT_";\nSQL: "_Sql)
    }    
/// Лучше if (SQLCODE <  0 ) {


Работает так как надо, спасибо.
...
Рейтинг: 0 / 0
Обработка ошибок
    #35536885
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bn1978
В этом месте SQLCODE 100 тоже попадает под исключение

В этом месте лучше написать так:
Код: plaintext
1.
2.
3.
4.
5.
if SQLCODE= 0  {
...
} elseif SQLCODE'= 100  {
ERR2
}
q return
...
Рейтинг: 0 / 0
Обработка ошибок
    #35540595
Lizard777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Prostite 4to translitom.
Ya proboval na4at polzovatsya: S $ZT="*onError". Po pri4ine tovo 4to ono sohranyaet zna4eniya vseh peremennih
Posle malenkovo research ya ponyal 4to mne nuz'en budet ZQ v slu4ae DO,FOR,XCUTE... (vse 4to opuskaet uroven na stack). No ne vsegda.
Vot 2 Primera:
1: zdes nelzya polzovatsya ZQ, potomu 4to vikinet menya dalshe 4em nado i KUKU ne polu4it 1.
Main
SET $ZTRAP="OnError1"
DO SubA
S KUKU=1
QUIT
SubA
SET $ZTRAP="*OnError"
SDC //ERROR
QUIT
OnError
QUIT

2: Zdes mne obyazarelno nuz'e ZQ ina4e zukru4us nadolgo v FOR
Main
SET $ZTRAP="OnError1"
DO SubA
S KUKU=1
QUIT
SubA
SET $ZTRAP="*OnError"
F i=1:1:1000 d
.SDC
QUIT
OnError
ZQ 1
QUIT

Kak mne bit esli ho4u ubit 2 zaitsev srazu, i ne zakrutitsya kak vol4ek v For i prodolz'it tu z'e funktsiu, i polu4it vse zna4eniya peremennih.
Moz'et est voobshe drugaya doroga?
Spsibo
...
Рейтинг: 0 / 0
Обработка ошибок
    #35540980
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
SET $ZTRAP="*OnError"
Что значит звездочка?

По поводу выхода из цикла - выходите сначала из цикла, затем после выхода из цикла проверяете, нужно ли выходить дальше и выходите дальше.
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541088
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lizard777Prostite 4to translitom.
Я пыжился прочесть... Но не смог
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541248
Lizard777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa Lizard777Prostite 4to translitom.
Я пыжился прочесть... Но не смог

Poprobuyte. Eto ne tak trudno kak kaz'etsya :)
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541337
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я понимаю... Но есть сайты позволяющие транслит переводить на русские буквы. Это потом хоть как-то читать можно.
Этим пользуются ребята из других стран. Я просто сталкивался с таким на форуме www.oldmerin.net

Вот тебе в помощь.
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541407
Lizard777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaДа я понимаю... Но есть сайты позволяющие транслит переводить на русские буквы. Это потом хоть как-то читать можно.
Этим пользуются ребята из других стран. Я просто сталкивался с таким на форуме www.oldmerin.net

Вот тебе в помощь.
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT

Перевод С транслита :)

Я пробовал начать пользоватся: С $ZT="*onError". По при4ине того что оно сохраняет значения всех переменных
После маленково research я понял что мне нужен будет ZQ в случае DO,FOR,XCUTE... (все что опускает уровень встэк). Но не всегда.
Вот 2 Примера:
1: здесь нельзя пользоватся ZQ, потому что выкинет меня далше чем надо и KUKU не получит 1.

Main
SET $ZTRAP="OnError1"
DO SubA
S KUKU=1
QUIT
SubA
SET $ZTRAP="*OnError"
SDC //ERROR
QUIT
OnError
QUIT

Здесь мне обязательно нужен ZQ иначе закручусь надолго в FOR

Main
SET $ZTRAP="OnError1"
DO SubA
S KUKU=1
QUIT
SubA
SET $ZTRAP="*OnError"
F i=1:1:1000 d
.SDC
QUIT
OnError
ZQ 1
QUIT

Как мне быть если хочу убить 2-ух зайцев сразу, и не закрутитса как волчек в FOR и продолжить ту же функцию, и получить все значения переменних.
Мозьет ест вообше другая дорога?
Спсибо
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541481
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, "не закрутитса как волчек в FOR" может помочь дополнительное условие, на которое может повлиять "обработчик ошибок"...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541502
Alex Bizi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaКак вариант, "не закрутитса как волчек в FOR" может помочь дополнительное условие, на которое может повлиять "обработчик ошибок"...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT


Lizard777 -> Alex Bizi
Да, я могу проверит значение $ESTACK в том месте где пишу $ZT и в соответствии сним делать ZQ (Y-X) когда Х ето начальный уровень ($zt) а Y конечный, в lable onERROR.
Но ето помоиму чесать правое ухо левой рукой! Нет?
Спасибо
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541519
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex BiziНо ето помоиму чесать правое ухо левой рукой! Нет?
Х/З...
Но хоть какой-то вариант решения у тебя уже будет...
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541534
Alex Bizi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa Alex BiziНо ето помоиму чесать правое ухо левой рукой! Нет?
Х/З...
Но хоть какой-то вариант решения у тебя уже будет...

До таково решения я и сам гаразд :)
Я думал ест мозьет чтото лучше.
Спасибо и на етом. :)

P.S.
что такое Х/З...?
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541671
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть я не до конца понял, в чем проблема?
Делать выход из процедуры, находясь в цикле?

1. делать сначала выход из цикла, затем на выходе из цикла анализировать состояние переменных цикла и при необходимости делать выход из процедуры.

2. делать выход из цикла с помощью goto на метку перед выходом из процедуры. Понятное дело, не всегда это хорошо, но при каких-то сильно страшный циклах так бывает красивее, чем делать многоступенчатый выход из цикла.

Но при чем тут обработчик ошибок? Я что-то не понял в постановке вопроса?
...
Рейтинг: 0 / 0
Обработка ошибок
    #35541931
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Biziчто такое Х/З...?
Мягкая транскрипция "хто его знает"...
...
Рейтинг: 0 / 0
Обработка ошибок
    #35542057
Lizard777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.Может быть я не до конца понял, в чем проблема?
Делать выход из процедуры, находясь в цикле?

1. делать сначала выход из цикла, затем на выходе из цикла анализировать состояние переменных цикла и при необходимости делать выход из процедуры.

2. делать выход из цикла с помощью goto на метку перед выходом из процедуры. Понятное дело, не всегда это хорошо, но при каких-то сильно страшный циклах так бывает красивее, чем делать многоступенчатый выход из цикла.

Но при чем тут обработчик ошибок? Я что-то не понял в постановке вопроса?

Попробуйте запустить ету программу через debuger.

Main
SET $ZTRAP="OnError1"
DO SubA
S KUKU=1
QUIT
SubA
SET $ZTRAP="*OnError"
F i=1:1:1000 d
.SDC
QUIT
OnError
ZQ 1
QUIT

Теперь сотрите ZQ 1. После OnError вас закинет обратно в For. Я же хочу вилететь на строку S KUKU=1 (как с обычным $ZT без *).
Надеусь будет понятно...
...
Рейтинг: 0 / 0
Обработка ошибок
    #35542061
Lizard777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa Alex Biziчто такое Х/З...?
Мягкая транскрипция "хто его знает"...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обработка ошибок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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