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

Откуда:
Сообщений: 844
Еще одно горячее обсуждение сегодня: пост по try catch в Developer Community.
19 апр 16, 19:16    [19079462]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3770
Речь идет о регистрации явных ошибок, для которых как минимум известно место их возникновения, а значит при желании можно понять контекст и воспроизвести ошибку, что практически равноценно ее исправлению. По мне так, не так важно в деталях, как регистрировать эту ошибку, главное, чтобы это было удобно разработчикам, которые занимаются поддержкой продукта.

Вот если бы это помогало при разборе ситуаций, когда ошибка не возникает явно, но программа отрабатывает неверно, причем это выявляется хорошо если спустя неделю по неверным или испорченным данным, при этом неизвестен контекст выполнения, дата ошибки и иногда даже версия программы ;-)
20 апр 16, 05:35    [19080346]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
EvLaUy
Member

Откуда: Москва
Сообщений: 2167
Блок А.Н.,
на уровне синтаксиса ЯП ловить не падения кода, а ошибки прикладной логики, реализуемой разработчиком? Если я, конечно, правильно понял Вашу мысль. Интересно, каким образом такое можно сделать?
20 апр 16, 12:36    [19081852]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 804
EvLaUy
Блок А.Н.,
на уровне синтаксиса ЯП ловить не падения кода, а ошибки прикладной логики, реализуемой разработчиком? Если я, конечно, правильно понял Вашу мысль. Интересно, каким образом такое можно сделать?

И я бы хотел такому научиться...
20 апр 16, 12:41    [19081924]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3116
Блог
AlexKB
EvLaUy
Блок А.Н.,
на уровне синтаксиса ЯП ловить не падения кода, а ошибки прикладной логики, реализуемой разработчиком? Если я, конечно, правильно понял Вашу мысль. Интересно, каким образом такое можно сделать?
И я бы хотел такому научиться...
17945666
20 апр 16, 13:11    [19082152]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 211
Найти ошибку / сбой программы, а вот косяк программиста - наврятли.

Потому и существуют патчи в Windows, так как регулярно находят косяки в программах.
Расчёт простой - одна ошибка на 100'000 это как пить дать.

Опечатку никак не найти (если вместо ">" по ошибке написал "<"). Программе то всё равно. Условие есть условие.
20 апр 16, 21:43    [19085271]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3770
EvLaUy
Блок А.Н.,
на уровне синтаксиса ЯП ловить не падения кода, а ошибки прикладной логики, реализуемой разработчиком? Если я, конечно, правильно понял Вашу мысль. Интересно, каким образом такое можно сделать?
Я говорю, что в том обсуждении люди предлагают методы поиска блестящей монетки под фонарем, при том, что на мой взгляд, гораздо больше проблем вызывает проблема поиска черной кошки ночью в темной комнате при том, что кошка еще не сидит на месте.

Рецепты я не хочу предлагать, тут ничего особо оригинального нет. Можно, например, записывать все вызовы и их результаты, чтобы при выявлении ошибки через неделю попробовать понять контекст, можно, например, пытаться анализировать ошибки прикладной логики и записывать их в лог, каноничным вариантом, наверное, является использование юнит-тестов. Но это все скучно и каждый раз индивидуально, а try/catch поставил и вроде бы проблема решена, можно пообсуждать :-)

Кстати, я слышал, что в некоторых средах частая установка try/catch сильно снижает производительность, даже если не выбрасывать исключения. Как с этим обстоят дела в Каше?
21 апр 16, 05:39    [19085929]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
eduard93
Member

Откуда:
Сообщений: 161
Блок А.Н.
Кстати, я слышал, что в некоторых средах частая установка try/catch сильно снижает производительность, даже если не выбрасывать исключения. Как с этим обстоят дела в Каше?

Хорошо обстоят. Если исключение не возникает, то падения производительности практически нет. Тест.
21 апр 16, 11:52    [19087251]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3116
Блог
eduard93
Хорошо обстоят. Если исключение не возникает, то падения производительности практически нет. Тест.
+ Пример кода с "ошибками"
Class Utils.Time AbstractFinal ]
{

/// <example>
/// d ##class(Utils.Time).Test()
/// </example>
ClassMethod 
Test()
{
  
#
  
count=1,1,1,2,3,5,10,100,1000,10000 {
    
start $ZH
    f 
i=1:1:count tSC = ..NoTry()
    
timeNoTry $ZH start

    
start $ZH
    f 
i=1:1:count tSC = ..Try()
    
timeTry $ZH start

    
"Итераций: "count,!,
      
"Время ""No Try"":", ?17, timeNoTry,!,
      
"Время ""Try"":", ?17, timeTry,!,
      
"""Try"" заняло "$FN(100*timeTry/timeNoTry,"",2), "% времени ""No Try""",!!
  
}
}

ClassMethod NoTry() As %Status InternalPrivate ]
{
  
tSC $$$OK$ZT "Trap"
  
= 1
  
$R(1000000)
  
;s c = 5/0
Exit
  
tSC
Trap
  
s $ZT ""
  
tSC $$$ERROR($$$CacheError,$ZE)
  
%objlasterror
  
s $ZE ""$EC ""
  
Exit
}

ClassMethod Try() As %Status InternalPrivate ]
{
  
tSC $$$OK
  try 
{
    
= 1
    
$R(1000000)
    
;s c = 5/0
  
catch ex {
    
;s tSC = $$$ERROR($$$CacheError, $ZE)
    ;s tSC = $$$ERROR($$$CacheError, ex.AsSystemError())
    
tSC ex.AsStatus()
    
%objlasterror
    
s $ZE ""$EC ""
  
}
  
tSC
}

}
22 апр 16, 10:46    [19092161]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 451
Хм...
+ без ошибки
Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST
Итераций: 1
Время "No Try": .000017
Время "Try": .000003
"Try" заняло 17.65% времени "No Try"

Итераций: 1
Время "No Try": .000003
Время "Try": .000001
"Try" заняло 33.33% времени "No Try"

Итераций: 1
Время "No Try": .000003
Время "Try": .000001
"Try" заняло 33.33% времени "No Try"

Итераций: 2
Время "No Try": .000002
Время "Try": .000002
"Try" заняло 100.00% времени "No Try"

Итераций: 3
Время "No Try": .000004
Время "Try": .000002
"Try" заняло 50.00% времени "No Try"

Итераций: 5
Время "No Try": .000004
Время "Try": .000004
"Try" заняло 100.00% времени "No Try"

Итераций: 10
Время "No Try": .000008
Время "Try": .000006
"Try" заняло 75.00% времени "No Try"

Итераций: 100
Время "No Try": .000063
Время "Try": .00005
"Try" заняло 79.37% времени "No Try"

Итераций: 1000
Время "No Try": .000586
Время "Try": .00049
"Try" заняло 83.62% времени "No Try"

Итераций: 10000
Время "No Try": .006036
Время "Try": .004976
"Try" заняло 82.44% времени "No Try"
+ с ошибкой
Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST
Итераций: 1
Время "No Try": .000215
Время "Try": .000259
"Try" заняло 120.47% времени "No Try"

Итераций: 1
Время "No Try": .000074
Время "Try": .000082
"Try" заняло 110.81% времени "No Try"

Итераций: 1
Время "No Try": .000069
Время "Try": .00008
"Try" заняло 115.94% времени "No Try"

Итераций: 2
Время "No Try": .000122
Время "Try": .000207
"Try" заняло 169.67% времени "No Try"

Итераций: 3
Время "No Try": .000226
Время "Try": .000288
"Try" заняло 127.43% времени "No Try"

Итераций: 5
Время "No Try": .000335
Время "Try": .000409
"Try" заняло 122.09% времени "No Try"

Итераций: 10
Время "No Try": .000591
Время "Try": .000714
"Try" заняло 120.81% времени "No Try"

Итераций: 100
Время "No Try": .007276
Время "Try": .00769
"Try" заняло 105.69% времени "No Try"

Итераций: 1000
Время "No Try": .058086
Время "Try": .082014
"Try" заняло 141.19% времени "No Try"

Итераций: 10000
Время "No Try": .488961
Время "Try": .499278
"Try" заняло 102.11% времени "No Try"
22 апр 16, 13:09    [19093296]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
Шваров Евгений
Member

Откуда:
Сообщений: 844
П.С.М.
Хм...
+ без ошибки
Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST
Итераций: 1
Время "No Try": .000017
Время "Try": .000003
"Try" заняло 17.65% времени "No Try"

Итераций: 1
Время "No Try": .000003
Время "Try": .000001
"Try" заняло 33.33% времени "No Try"

Итераций: 1
Время "No Try": .000003
Время "Try": .000001
"Try" заняло 33.33% времени "No Try"

Итераций: 2
Время "No Try": .000002
Время "Try": .000002
"Try" заняло 100.00% времени "No Try"

Итераций: 3
Время "No Try": .000004
Время "Try": .000002
"Try" заняло 50.00% времени "No Try"

Итераций: 5
Время "No Try": .000004
Время "Try": .000004
"Try" заняло 100.00% времени "No Try"

Итераций: 10
Время "No Try": .000008
Время "Try": .000006
"Try" заняло 75.00% времени "No Try"

Итераций: 100
Время "No Try": .000063
Время "Try": .00005
"Try" заняло 79.37% времени "No Try"

Итераций: 1000
Время "No Try": .000586
Время "Try": .00049
"Try" заняло 83.62% времени "No Try"

Итераций: 10000
Время "No Try": .006036
Время "Try": .004976
"Try" заняло 82.44% времени "No Try"
+ с ошибкой
Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST
Итераций: 1
Время "No Try": .000215
Время "Try": .000259
"Try" заняло 120.47% времени "No Try"

Итераций: 1
Время "No Try": .000074
Время "Try": .000082
"Try" заняло 110.81% времени "No Try"

Итераций: 1
Время "No Try": .000069
Время "Try": .00008
"Try" заняло 115.94% времени "No Try"

Итераций: 2
Время "No Try": .000122
Время "Try": .000207
"Try" заняло 169.67% времени "No Try"

Итераций: 3
Время "No Try": .000226
Время "Try": .000288
"Try" заняло 127.43% времени "No Try"

Итераций: 5
Время "No Try": .000335
Время "Try": .000409
"Try" заняло 122.09% времени "No Try"

Итераций: 10
Время "No Try": .000591
Время "Try": .000714
"Try" заняло 120.81% времени "No Try"

Итераций: 100
Время "No Try": .007276
Время "Try": .00769
"Try" заняло 105.69% времени "No Try"

Итераций: 1000
Время "No Try": .058086
Время "Try": .082014
"Try" заняло 141.19% времени "No Try"

Итераций: 10000
Время "No Try": .488961
Время "Try": .499278
"Try" заняло 102.11% времени "No Try"

Ого. Т.е. получается try catch серьезно замедляет исполнение. Не хотите тут опубликовать код и исследование?
А на какой версии проверялось?
25 апр 16, 04:33    [19100813]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 451
Шваров Евгений,
Код servit привел, я лишь запустил на исполнение (см. последнее сообщение от servit) :)
Да и версия, вроде как, тоже указана:
Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST

Ну и замедление происходит в случае ошибки, а в случае отсутствия ошибок, наоборот, работает быстрее чем код с "классическим" обработчиком )))
25 апр 16, 09:22    [19101188]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
Шваров Евгений
Member

Откуда:
Сообщений: 844
П.С.М.
Шваров Евгений,
Код servit привел, я лишь запустил на исполнение (см. последнее сообщение от servit) :)
Да и версия, вроде как, тоже указана:
Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST

Ну и замедление происходит в случае ошибки, а в случае отсутствия ошибок, наоборот, работает быстрее чем код с "классическим" обработчиком )))


Что-то я "подиагонали совсем" прочитал код спросонья - извините)
А такое проверяли? - один и тот же код, без ошибок - с try catch и без try catch (и без "классического" обработчика)?
Т.е. интересно, если просто вставить try catch блок, дает ли это замедление кода внутри блока?
25 апр 16, 10:28    [19101546]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3116
Блог
П.С.М.
Код servit привел, я лишь запустил на исполнение (см. последнее сообщение от servit) :)
Там точнее можно увидеть автора кода: 19092161
Шваров Евгений
Ого. Т.е. получается try catch серьезно замедляет исполнение. Не хотите тут опубликовать код и исследование?
Как-то не состыкуются "серьёзно замедляет" и "падения практически нет":
eduard93
Блок А.Н.
Кстати, я слышал, что в некоторых средах частая установка try/catch сильно снижает производительность, даже если не выбрасывать исключения. Как с этим обстоят дела в Каше?
Хорошо обстоят. Если исключение не возникает, то падения производительности практически нет. Тест.
25 апр 16, 10:40    [19101612]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3116
Блог
Шваров Евгений
Т.е. интересно, если просто вставить try catch блок, дает ли это замедление кода внутри блока?
Нет.
+ Cache for Windows (x86-64) 2016.2 (Build 636U) Wed Apr 13 2016 20:58:35 EDT
Class Utils.Time2 AbstractFinal ]
{

/// <example>
/// d ##class(Utils.Time2).Test()
/// </example>
ClassMethod 
Test()
{
  
#
  
count=1,1,1,2,3,5,10,100,1000,10000 {
    
start $ZH
    f 
i=1:1:count tSC = ..NoTry()
    
timeNoTry $ZH start

    
start $ZH
    f 
i=1:1:count tSC = ..Try()
    
timeTry $ZH start

    
"Итераций: ",count,!,
      
"Время ""No Try"":",?17,timeNoTry,!,
      
"Время ""Try"":",?17,timeTry,!,
      
"""Try"" заняло ",$FN(100*timeTry/timeNoTry,"",2),"% времени ""No Try""",!!
  
}
}

ClassMethod NoTry() As %Status InternalPrivate ]
{
  
= 1
  
$R(1000000)
  
q $$$OK
}

ClassMethod Try() As %Status InternalPrivate ]
{
  
try {
    
= 1
    
$R(1000000)
  
catch {}
  
q $$$OK
}

}
Итераций: 1
Время "No Try": .000013
Время "Try": .000003
"Try" заняло 23.08% времени "No Try"

Итераций: 1
Время "No Try": .000003
Время "Try": .000002
"Try" заняло 66.67% времени "No Try"

Итераций: 1
Время "No Try": .000003
Время "Try": .000001
"Try" заняло 33.33% времени "No Try"

Итераций: 2
Время "No Try": .000003
Время "Try": .000002
"Try" заняло 66.67% времени "No Try"

Итераций: 3
Время "No Try": .000004
Время "Try": .000003
"Try" заняло 75.00% времени "No Try"

Итераций: 5
Время "No Try": .000004
Время "Try": .000003
"Try" заняло 75.00% времени "No Try"

Итераций: 10
Время "No Try": .000008
Время "Try": .000007
"Try" заняло 87.50% времени "No Try"

Итераций: 100
Время "No Try": .000062
Время "Try": .000066
"Try" заняло 106.45% времени "No Try"

Итераций: 1000
Время "No Try": .000633
Время "Try": .000631
"Try" заняло 99.68% времени "No Try"

Итераций: 10000
Время "No Try": .006223
Время "Try": .006126
"Try" заняло 98.44% времени "No Try"
Нужно ещё учитывать прогрев кэша, например если поменять местами очерёдность вызовов ..Try()/..NoTry().
Где-то здесь этот вопрос уже обсуждался.
25 апр 16, 10:54    [19101701]     Ответить | Цитировать Сообщить модератору
 Re: Try catch в Cache  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3116
Блог
Влияние "прогрева" становится особенно очевидным, если сделать

start $ZH
i=1:1:count tSC = ..NoTry()
timeNoTry $ZH start

start $ZH
i=1:1:count tSC = ..NoTry()
timeTry $ZH start

или

start $ZH
i=1:1:count tSC = ..Try()
timeNoTry $ZH start

start $ZH
i=1:1:count tSC = ..Try()
timeTry $ZH start
25 апр 16, 11:16    [19101841]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить