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

Откуда: Москва
Сообщений: 82
Уважаемые коллеги, подскажите пожалуйста, как определить уровень стека, на котором произошла ошибка, а потом вывести все переменные этого уровня стека (читай - в контексте ошибки) ?

Для чего: в стандартном просмотрщике ошибок приложения в портале управления системой слишком много лишней информации, а хотелось бы видеть только ту, что относится непосредственно к ошибке, поэтому делаю свой инструмент для ускорения и облегчения дебага.

Для просмотра стека и всей информации по ошибке использую просмотр глобала ^ERRORS(date,errNum,...).
2 июн 16, 13:54    [19250036]     Ответить | Цитировать Сообщить модератору
 Re: Определение уровня стека с ошибкой  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3103
Блог
drakut
как определить уровень стека
Current Context Level
2 июн 16, 14:00    [19250086]     Ответить | Цитировать Сообщить модератору
 Re: Определение уровня стека с ошибкой  [new]
drakut
Member

Откуда: Москва
Сообщений: 82
servit,

автор
You can use the following to return information about the current context level


Это для времени выполнения. Некая программа уже работает и генерит ошибки, то есть ошибка уже случилась, и записалась в портале.
Из всего хлама мне надо выделить наиболее ценную информацию. Определять контекст текущего уровня выполнения мне не надо.
2 июн 16, 14:06    [19250131]     Ответить | Цитировать Сообщить модератору
 Re: Определение уровня стека с ошибкой  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3103
Блог
drakut
Некая программа уже работает и генерит ошибки, то есть ошибка уже случилась, и записалась в портале.
Из всего хлама мне надо выделить наиболее ценную информацию.
SYS.ApplicationError:ErrorDetail

Type:
0 = Expressions
-1 = Stack Levels
-2 = Collapsed stack levels
i = Variables of Stack Level #i
2 июн 16, 14:53    [19250446]     Ответить | Цитировать Сообщить модератору
 Re: Определение уровня стека с ошибкой  [new]
drakut
Member

Откуда: Москва
Сообщений: 82
servit,

это тоже пробовал, но результат работы этого классового запроса - почти то же самое, что и и портале.

На данный момент решено сделать поиск по значениям глобала ^ERRORS фразы %Exception.SystemException, второй индекс этого узла и будет номером нужного уровня стека, переменные этого уровня и будем выводить.
2 июн 16, 15:11    [19250544]     Ответить | Цитировать Сообщить модератору
 Re: Определение уровня стека с ошибкой  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13072
drakut
Уважаемые коллеги, подскажите пожалуйста, как определить уровень стека, на котором произошла ошибка, а потом вывести все переменные этого уровня стека (читай - в контексте ошибки) ?

До этого я интересовался примерно тем же...
+ Вот результат моих изысканий (работает как в Каше, так и ГТ.М)
zerror ;
  /// Пример использования обработчика ошибок
  
n $es
  s $et
="d ERROR^zerror(""showErr^zerror(1)"")"
  
s $ec=""
  
TEST
  
q
TEST ; Защищаемая процедура
  
val
  
val="Test"
  
1/0
  
q
  
/// Произошла ошибка. Запишем в глобал и выведем сообщение
  /// [Параметр]
  /// %ePrc - Имя пользовательской процедуры
ERROR(%ePrc)
  
%eGlb
  
%ePrc=$g(%ePrc)
  
%eGlb=$$save^zerror("MSP")
  
q:%eGlb=""!(%ePrc="")
  
@%ePrc
  
q
  
/// Пример пользовательской процедуры вывода информации об ошибке
showErr(Type)
  
txt
  
i $g(Type)=1 ERRWRT^zerror q:$q q
  s 
txt(1)="@Произошла ошибка"
  
txt(3)="Код ошибки: @"_$tr($g(@%eGlb@("$ec")),",")
  
txt(4)="Вызов: @"_$g(@%eGlb@("$place"))
  
;d BoxMess^aBOX(,,.txt)
  ;d SCRERR^aMENUTWO
  
q
ERRWRT ; Консольное сообщение об ошибке
  
!!,"Произошла ошибка"
  
!,"Код  : "_$tr($g(@%eGlb@("$ec")),",")
  
!,"Вызов: "_$g(@%eGlb@("$place"))
  
!,"Ошибка зарегистрирована в журнале.",!
  
q
  
/// Запись в ^UTILITY информации об ошибке
  /// [Параметр]
  /// %eTsk* - Имя задачи
save(%eTsk)
  
%eLev,%eGlb,%eNum,%eCd,%eVar,%eNm,%eSt,%eZe
  
u $p
  i $ec
["<DSCON>" q:$q "" q
  w 
/proff
  
TROLLBACK
  d 
DATA^zerror
  
ERRTITLE^zerror
  
VARLIST^zerror
  
STACK^zerror
  
s $et="d ERR^zerror("""_$$Trans^zfunc($et)_""")"
  
q:$q %eGlb
  
q
ERR(Run) ; Внутренний перехват ошибки - выйдем на нужном уровне
  
q:$es>2
  
s $et=Run
  
s $ec=""
  
q
DATA ; Определим переменные
  
%eCd=$p($ec,",",2)
  
%eGlb=$na(^UTILITY("%ER",+$h))
  
%eNum=$i(@%eGlb@(0))
  
%eGlb=$na(@%eGlb@(%eNum))
  
%eNm=$na(@%eGlb@("Var"))
  
%eSt=$na(@%eGlb@("Stack"))
  
%eLev=$st(-1)
  
%eZe=$p($ze,">",2)
  
q
ERRTITLE ; "Заголовок" ошибки
  
TTL^zerror("$ec",$ec,1)
  
TTL^zerror("$h",$$Date^zfunc_" "_$$Time^zfunc(,3))
  
TTL^zerror("$zv",$zv)
  
TTL^zerror("$p",$p)
  
TTL^zerror("$i",$i)
  
TTL^zerror("$s",$s)
  
@%eGlb@("task")=%eTsk
  
TTL^zerror("$zr",$$glb^zsys)
  
TTL^zerror("$$wp^zsys",$$wp^zsys)
  
TTL^zerror("$place",%eZe,1)
  
;d TTL^zerror("$place",$st(%eLev-3,"PLACE"),1)
  
i $g(Info)'="",$d(@Info@%eGlb@("Info")=@Info
  
@%eGlb=$ec_" "_$st(%eLev-3,"PLACE")
  
q
TTL(Nm,Val,Up) ; Запишем общие данные
  
'$g(Up@%eGlb@("Info",Nm)=Val q
  s 
@%eGlb@(Nm)=Val
  
q
VARLIST ; Список локальных переменных
  
%eVar=$$firstVar^zsys
  
f  s %eVar=$o(@%eVarq:%eVar=""  NEXTVAR^zerror
  
q
NEXTVAR ; Следующая локальная переменная
  
ln
  
ln=",%eLev,%eGlb,%eNum,%eCd,%ePrc,"
  
ln=ln_"%eVar,%eNm,%eSt,%eZe,%eTsk,"
  
q:ln[(","_%eVar_",")
  
@%eNm@(%eVar)=@%eVar
  
q
STACK ; Запишем стек
  
lev,num,code,len
  
num=-1
  
%eLev=%eLev-3
  
len=$l(%eLev)
  
%eZe=$p(%eZe," ")
  
lev=%eLev:-1:0 NEXTLEV^zerror
  
q
NEXTLEV ; Пишем очередной уровень стека
  
val
  
val=$st(lev,"PLACE")
  
code=$$PadL^zfunc($i(num),len)_". "_val
  
@%eSt@(code)=$$line(lev)
  
q
line(Lev) ; Строка с ошибкой
  
q $$At^zfunc($tr($st(Lev,"MCODE"),$c(9)," "))
  
/// Обработка исключения
  /// [Параметры]
  /// Proc* - Процедура подлежащая защите
  /// pUser - Пользовательская обработка исключения
exception(Proc,pUser)
  
syserr,syset
  
pUser=$g(pUser)
  
syset=$et
  s $ec
=""
  
syserr=0
  
s $et="d EXCEPTION^zerror"
  
@Proc
  
q:$q syserr
  
q
EXCEPTION ; Действия при возникновении исключения
  
syserr=1
  
d:$g(pUser)'="" @pUser
  
s $ec=""
  
s $et=syset
  
q
2 июн 16, 16:10    [19250884]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить