|
Попытка-Исключение в транзакции приводит к проблемам | ☑ | ||
---|---|---|---|---|
0
vi0
10.04.14
✎
21:53
|
в "книге 1С Эксперта" говорится, что использование Попытка-Исключение в транзакции является приемом, который приводит к проблемам
ваше мнение согласны, нет? почему? |
|||
1
ДенисЧ
10.04.14
✎
21:59
|
да
|
|||
2
Ksandr
10.04.14
✎
22:02
|
да.
|
|||
3
Зойч
10.04.14
✎
22:03
|
Не всегда.
Если запись данных в базу выполнилась с ошибкой, то никакая попытка не поможет |
|||
4
Злопчинский
10.04.14
✎
22:05
|
в этом бл..ом снеговике - может быть...
в клюшках нормально работает. у меня в достаточно большом количестве мест используется - траблов не натыкался.. может просто потому что везло или комплекс мероприятий... |
|||
5
vi0
10.04.14
✎
22:07
|
(3) не поможет - понятно
какие проблемы будут? единственное - если после попытки программист не позаботится закончить серверный вызов и дождется "в транзакции уже происходили ошибки" - ну так это скорее проблемы програмиста, а не платформы |
|||
6
Ksandr
10.04.14
✎
22:35
|
(5) которые станут проблемами конечного пользователя.
|
|||
7
vi0
10.04.14
✎
22:50
|
(6) повторю - это не проблемы конструкции Попытка Исключение
|
|||
8
Ненавижу 1С
гуру
10.04.14
✎
22:55
|
а что вы хотели?
сама транзакция, это попытка, просто движок 1С кривоват тут |
|||
9
vi0
10.04.14
✎
22:56
|
(8) мы хотели ответы на ворпросы
согласны, нет? почему? |
|||
10
spectre1978
10.04.14
✎
23:03
|
Да, в восьмерке это не работает нормально, сталкивался. в семерке работает корректно.
|
|||
11
vi0
10.04.14
✎
23:12
|
(10) что именно не работает нормально в 8ке и работает нормально в 7ке ?
|
|||
12
Torquader
10.04.14
✎
23:48
|
В семёрке исключение автоматом отменяет транзакцию, насколько я помню, в восьмёрке - нет.
|
|||
13
Ksandr
11.04.14
✎
00:15
|
(12) В 8 тоже отменяет. Проверить можно через ТранзакцияАктивна()
|
|||
14
EugeniaK
11.04.14
✎
00:17
|
Конструкция Попытка - Исключения всегда и везде приводит к проблемам. Дело не в транзакции.
|
|||
15
Torquader
11.04.14
✎
00:24
|
(14) К каким таким проблемам ?
Это же перехват прерывания исполнения программы. Вы ещё скажите, что вам "ВызватьИсключение" не по душе. |
|||
16
Ksandr
11.04.14
✎
00:56
|
(15) К таким, что от не знания как проверить наличие свойства у объекта не опытные программисты начинают пихать в попытки Объет.МожетБытьСвойство
ВызватьИсключение по душе, но только при необходимости прерывания выполнения программы. Когда something going wrong и дальнейшее выполнение не целесообразно или может привести к записи ошибочных данных. |
|||
17
vi0
11.04.14
✎
08:14
|
пока все озвученные доводы были только про кривые руки программиста
|
|||
18
spectre1978
11.04.14
✎
10:03
|
(11) сейчас уже не припомню, два года назад вопрос был. Но точно помню, что ситуация эта даже была документирована и я прочитал что так делать нельзя. То ли вложенных блоков попытка-исключение касалось, то ли еще чего-то такого. Ограничение платформы.
|
|||
19
Базис
naïve
11.04.14
✎
10:08
|
А теперь включите в отладчике остановку на ошибках и запустите какой-нибудь Рарус Альфа Авто или другую франчовую конфу. Оно постоянно отменяет транзакции, и вложенные там не редкость. Так что теория может быть правильной, но её мало кто применяет.
|
|||
20
EugeniaK
11.04.14
✎
10:19
|
(15) Исключительная ситуация это признак того, что в коде что-то отработало некорректно. Т.е. что-то нужное не выполнилось. Нужно анализировать, какие могут быть причины ошибок и описывать, что именно должна делать система при них.
А еще конфигурацию, в которой большое количество конструкций "Попытка", дико неудобно отлаживать, если нужно остановиться на ошибке. Потому что останавливается она еще в сотне мест до нужного. |
|||
21
maxile
11.04.14
✎
10:25
|
Нет Здесь эта транзакция используется как исключение когда временно надо обойти ошибку.
|
|||
22
le_
11.04.14
✎
10:29
|
(0) Да, приводит. И некоторые версии платформы даже неправильно тексты ошибок показывают при этом. Разобраться можно только с отладчиком.
|
|||
23
vde69
модератор
11.04.14
✎
10:45
|
не приводит,
проблеммы возникают только при вложении транзакции. |
|||
24
ifso
11.04.14
✎
11:09
|
(14)
> Конструкция Попытка - Исключения всегда и везде > приводит к проблемам. особливо в пятницу ;) |
|||
25
ifso
11.04.14
✎
11:15
|
(20)
> Исключительная ситуация это признак того, что в коде > что-то отработало некорректно. С каких пор вилка виновата, что кто-то ею в глаз тычет? |
|||
26
Maxus43
11.04.14
✎
11:25
|
(13) не отменяет исключение транзакцию
|
|||
27
Maxus43
11.04.14
✎
11:28
|
надо правильно просто писать...
конструкция НачатьТранзакцию() Попытка //ошибка Исключение ОтменитьТранзакцию(); КонецПопытки; Если ТранзакцияАктивна() Тогда ЗафиксироватьТранзакцию(); КонецЕсли; НЕ правильная, она не работает действительно |
|||
28
Maxus43
11.04.14
✎
11:30
|
работает так:
ЕстьОшибка = Ложь; НачатьТранзакцию(); Попытка //ошибка Исключение ЕстьОшибка = Истина; КонецПопытки; Если ЕстьОшибка Тогда ОтменитьТранзакцию(); Иначе ЗафиксироватьТранзакцию(); КонецЕсли; |
|||
29
elCust
11.04.14
✎
11:30
|
(27) А как сработает такая конструкция если ее реализовать в ОбработкаПроведения?
|
|||
30
vi0
11.04.14
✎
11:32
|
еще интересное наблюдение:
НачатьТранзакцию() Попытка //ошибка Исключение КонецПопытки; ЗафиксироватьТранзакцию(); // делает ROLLBACK в SQL |
|||
31
Maxus43
11.04.14
✎
11:34
|
(29) такая конструкция не рабочая.
В Обработке проведения - нафига вобще так делать? Это можно использовать при загрузчиках каких-то, своих непонятных алгоритмах, но не при неявных транзакциях патформенных, зачем там? |
|||
32
Maxus43
11.04.14
✎
11:35
|
(30) а вот между
Исключение КонецПопытки; вставь сообщить(ТранзакцияАктивна()) и её как будто бы и нет. а на самом деле транзакция есть и живёт, надо юзать (28) чтобы номрально отрабатывало |
|||
33
Maxus43
11.04.14
✎
11:36
|
в рамках попытки обращаться к командам транзакции - будет ошибка, многие почему то думают что реально транзакция сдыхает из-за этого
|
|||
34
NcSteel
11.04.14
✎
11:38
|
(0) Что за книга - не знаю о такой.
А по сабжу - нет проблемы в Попытке исключения, важно грамотно закрывать транзакцию. |
|||
35
Maxus43
11.04.14
✎
11:38
|
(30) >>ЗафиксироватьТранзакцию(); // делает ROLLBACK в SQL
странно что-то, какая платформа? |
|||
36
Maxus43
11.04.14
✎
11:39
|
(34) недавно появилась, смотри в магазе 1с, автор из БИТа
|
|||
37
ramir
11.04.14
✎
11:41
|
(27) А вот так писать, не вариант?
НачатьТранзакцию() Попытка //ошибка ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; |
|||
38
Drac0
11.04.14
✎
11:42
|
(37) +1
|
|||
39
goleaff2006
11.04.14
✎
11:50
|
(37)так писать религия многим не позволяет =))Надо обязательно г...о код писать=)
|
|||
40
Maxus43
11.04.14
✎
11:50
|
(37) проверь
|
|||
41
ramir
11.04.14
✎
11:51
|
(40) Давно уже это сделал. Так и пишу.
|
|||
42
Bigbro
11.04.14
✎
11:52
|
не понимаю проблемы. почему все пытаются фиксировать внешнюю транзакцию когда во вложенной прошла ошибка?
|
|||
43
Maxus43
11.04.14
✎
11:52
|
я обычно использую такой говнокод когда загрузки данных идут, в цикле ты как напишешь (37)? чтобы фиксировалось всё, а не каждый элемент?
|
|||
44
ramir
11.04.14
✎
11:54
|
(16) Когда "возникает необходимость" сделать ВызватьИсключение из блока Исключение. Я этого не делаю, сразу пишу запись в журнал регистрации. Регламентным заданием проверяю журнал регистрации на "свои" ошибки и записываю в специально созданный для этого справочник, чтобы база сама говорила мне о произошедших ошибках. Все это, конечно, вынесено в отдельный модуль.
|
|||
45
ramir
11.04.14
✎
11:58
|
(43) я пишу такой код не от того, что это овнокод, а для того, чтобы если все-таки произойдет нештатная ситуация не показывать юзеру системные сообщения об ошибках.
|
|||
46
scanduta
11.04.14
✎
11:58
|
(0)в "книге 1С Эксперта" говорится, что использование Попытка-Исключение в транзакции является приемом, который приводит к проблемам
к каким проблемам в книге не написано ? |
|||
47
Maxus43
11.04.14
✎
12:03
|
(45) ещё раз. Надо загрузить в цикле данные, в транзакции.
И выдавать юзеру не ошибку программного кода с кнопками подробно/конфигуратор а нормальную осмысленную - для этого используется (28). Юзая другие варианты - у тебя будут ошибки |
|||
48
ramir
11.04.14
✎
12:09
|
(47) В цикле никогда использовать не приходилось. На первый взгляд не улавливаю где возникнет ошибка
НачатьТранзакцию() Попытка Пока ... Цикл //ошибка КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; |
|||
49
vi0
11.04.14
✎
12:17
|
(46) не написано
|
|||
50
floody
11.04.14
✎
12:19
|
(49) всё там написано, читайте лучше
|
|||
51
vi0
11.04.14
✎
12:21
|
(50) процитируйте, пожалуйста
|
|||
52
floody
11.04.14
✎
12:23
|
страница 43, абзацы 5,6,7
|
|||
53
vi0
11.04.14
✎
12:28
|
(35)
1С:Предприятие 8.2 (8.2.17.169) // rollback возникает при такой ошибке например а = Справочники.Склады.СоздатьЭлемент(); а.Код = "ф"; а.Записать(); а = Справочники.Склады.СоздатьЭлемент(); а.Код = "ф"; а.Записать(); // при этом выполняется commit а = 1/0; |
|||
54
vi0
11.04.14
✎
12:29
|
(52) нет книги с собой
что там в двух словах хотябы? |
|||
55
Господин ПЖ
11.04.14
✎
12:39
|
более точная формулировка: кривая реализация проводит к проблемам...
|
|||
56
anddro
11.04.14
✎
15:52
|
В транзакции вставляю попытку с ошибкой:
Попытка а = Число("бу"); Исключение ИОШ = ИнформацияОбОшибке(); Сообщить(КраткоеПредставлениеОшибки(ИОШ)); Конецпопытки; Исключение есть, но транзакция успешно прошла, изменения в базе. Или причина в том, что именно вызвало исключение? И не все исключения одинаковы. |
|||
57
anddro
11.04.14
✎
16:01
|
И вот такое исключение (которое возникает при изменении данных) действительно приводит к тому, что транзакция откатывается:
Попытка об = Справочники.КонтактныеЛица.НайтиПоНаименованию("Иванов").ПолучитьОбъект(); об.Владелец = Неопределено; об.Записать(); Исключение ИОШ = ИнформацияОбОшибке(); Сообщить(КраткоеПредставлениеОшибки(ИОШ)); КонецПопытки; |
|||
58
Torquader
11.04.14
✎
16:11
|
(57) Можно предположить, что из-за ошибки записи данных сначала откатывается транзакция, вызвавшая ошибку, а потом генерится исключение (уже на стадии вывода ошибки пользователю).
|
|||
59
Попытка1С
11.04.14
✎
16:21
|
(47) В цикле все это делается на 1000 элементов к примеру. потом заново открытие
|
|||
60
vde69
модератор
11.04.14
✎
16:27
|
пока без ответа но в тему v8: нужна ли транзакция в обработке БП
|
|||
61
Torquader
11.04.14
✎
16:41
|
Проведение документа в транзакции - это вложенная транзакция ?
И насколько она правильно отрабатывает при отмене проведения ? |
|||
62
vde69
модератор
11.04.14
✎
17:02
|
(61)
распишу свои мысли: вообще на сколько я знаю в 1с есть глобальный флаг ошибки транзакции, по этому НачатьТранзакцию(); Попытка НачатьТранзакцию(); Для Каждого эл из Объекты Цикл // тут изменяем документы КонецЦикла; ЗафиксироватьТранзакцию(); Исключение Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; КонецПопытки; ЗафиксироватьТранзакцию(); в случае обработаной ошибки вложеной транзакции приведет к ошибке в момент попытки фиксации верхнего уровня транзакции будет ошибка.... а вот такая конструкция будет нормально работать при условии, что внутри попытки нет транзакций.... НачатьТранзакцию(); НачатьТранзакцию(); Попытка Для Каждого эл из Объекты Цикл // тут изменяем документы КонецЦикла; Исключение КонецПопытки; ЗафиксироватьТранзакцию(); ЗафиксироватьТранзакцию(); |
|||
63
vi0
13.04.14
✎
16:05
|
(52) Перечитал страницу 43, абзацы 5,6,7 и далее
в общем автор книги сам дает рекомендации использовать ВызватьИсключение после обработки исключительной ситуации. Так что проблем, по прежнему не видно. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |