Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
 TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
u78
Member

Откуда: Москва
Сообщений: 519
Вариант 1
 try {
 
TSTART  
 TCOMMIT
 
}
 
catch {
 
TROLLBACK
 
}
или
Вариант 2
 TSTART
 try 
{
  
 
 }
 
catch {
 
 }
 
IF ok TCOMMIT
 Else  TROLLBACK

Какой вариант благославляется, а какой не благославляется? Почему?
14 дек 16, 17:03    [20003589]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3394
Второй вариант странный, зачем он?
Я бы делал trollback 1, иначе можете откатить чужую транзакцию.
14 дек 16, 18:49    [20004043]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3048
Блог
u78,

Например, в исходниках %SYS встречается только вариант №1 (с вариациями). Но возможно плохо искал.
14 дек 16, 18:50    [20004047]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
u78
Member

Откуда: Москва
Сообщений: 519
Блок А.Н.,

да, надо TROLLBACK 1, но сейчас вопрос не в этом
спрашивая коллег, столкнулся с тем - что оба этих варианта коллеги отстаивают как логичные и богоугодные, вот решил коммьюнити спросить
14 дек 16, 18:57    [20004068]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
Шваров Евгений
Member

Откуда:
Сообщений: 819
u78,

Предлагаю спросить еще и это комьюнити - вдруг кто-то еще отстаивает вариант 2 и с аргументацией?
14 дек 16, 19:22    [20004141]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
Ptn
Guest
u78,

Наверное вкусовщина. Глазу и логике в отдельном блоке приятен первый вариант.

Второй вариант получается сам собой же при вызовах
 TSTART

 SET 
ok Вариант 1

 
IF ok TCOMMIT
 Else  TROLLBACK
Что до аргументов, то Вариант 1 ловит исключение при выполнении TCOMMIT, а вот во втором варианте - нет.
15 дек 16, 07:40    [20005238]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3048
Блог
u78,

Кроме того - при прочих равных - во втором варианте выполняется дополнительное условие. Причём всегда.
15 дек 16, 09:11    [20005364]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
Petr0vi4444
Member

Откуда: Владивосток
Сообщений: 137
Я за гибридный вариант:
 TSTART
 Try 
{
    
Set sc = ..doSomething()
 
Catch exception {
    
Set sc exception.AsStatus()
 
}
 
If ('sc{
    
TROLLBACK 1
 
Else {
    
TCOMMIT
 
}
 
Quit sc
15 дек 16, 12:18    [20006450]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3048
Блог
Petr0vi4444
Я за гибридный вариант:
Это второй вариант.

Здесь будет гораздо ценнее аргументация (вторая часть вопроса ТС).
15 дек 16, 12:32    [20006522]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
Petr0vi4444
Member

Откуда: Владивосток
Сообщений: 137
servit
Здесь будет гораздо ценнее аргументация (вторая часть вопроса ТС).
Во втором варианте единый блок обработки результата с типом %Status.
В первом варианте если в блоке Try не возникло исключения, но операция выполнилась неуспешно, после Catch нужно проверять результат и делать TROLLBACK в случае ошибки.
Это приводит к дублированию кода и если помимо TROLLBACK необходимо сделать ещё какие-нибудь операции, код становится слишком громоздским, например:
 TSTART
 Try 
{
    
Set sc = ..save()
 
Catch exception {
    
TROLLBACK 1
    
Kill %objlasterror
    
Do ##class(Log).addException(exception)
 
}
 
Quit:$D(exception) ..doSomethingIfError(exception.AsStatus())
 
If ('sc{
    
TROLLBACK 1
    
Kill %objlasterror
    
Do ##class(Log).addError(sc)
    
Quit ..doSomethingIfError(sc)
 
}
 
TCOMMIT
 Quit 
sc
+ P.S.
Никак не пойму какими тэгами оформлять код
15 дек 16, 14:00    [20007004]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3394
Petr0vi4444,

Непонятно, зачем вы это делаете. Почему бы в случае ошибки не выбросить исключение?
15 дек 16, 14:19    [20007141]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3048
Блог
Petr0vi4444
Во втором варианте единый блок обработки результата с типом %Status.
В первом варианте если в блоке Try не возникло исключения, но операция выполнилась неуспешно, после Catch нужно проверять результат и делать TROLLBACK в случае ошибки.
Разве не проще сделать так, как сделано, например, в %SYSTEM.SQL?
 Set sc $$$OK
 Try 
{
    
TSTART
    $$$ThrowOnError
(..doSomething())
    
TCOMMIT
 
Catch exception {
    
TROLLBACK 1
    
Set sc exception.AsStatus()
 
}
 
Quit sc
+ P.S.
Petr0vi4444
Никак не пойму какими тэгами оформлять код
Вы и так оформляете правильными тегами.
15 дек 16, 15:00    [20007550]     Ответить | Цитировать Сообщить модератору
 Re: TS TRY CATCH TC или TRY TS TC CATCH ?  [new]
DAiMor
Member

Откуда: Brno, Czech Republic
Сообщений: 2268
Petr0vi4444,

Исходники оформлять нужно тегом [src], а у servit есть под рукой инструмент для корректной расскраски кода, что он и делает после публикации.
15 дек 16, 15:48    [20007925]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché Ответить