Ну в общем-то да. Зато «нарисовался» другой вопрос — подходит ли этот паттерн в случае когда наш код является самым «верхним» по стеку, т.е. выше него уже нет кода. Как тогда быть, если команда НачатьТранзакцию() выбросит исключение? Что тогда произойдёт?
Кто будет обрабатывать исключение?
Не совсем так.
Смысл такой — написать код таким образом, чтобы в случае, если исключение происходило в команде
НачатьТранзакцию()
(при этом транзакция не начнётся — поскольку — исключение выкидывает) тогда команда
ОткатитьТранзакцию()
выполняться не должна, иначе возможен случай, когда мы откатим транзакцию, которую не мы начинали — т.е. откатим «чужую» транзакцию, которая не была начата в этом программном блоке.
ЦелоеЧисло Ж;
Ж := 1;
Попытка
НачатьТранзакцию();
Ж := 2;
ДелаемЧтоТо();
ЗафиксироватьТранзакцию();
Исключение
Если ( ТранзакцияАктивна() И (Ж==2) )
Тогда ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Смысл я вкладывал такой:
Если инструкция НачатьТранзакцию() выбросит исключение
то попадаем в блок перехвата исключения и при этом
Если ( ТранзакцияАктивна() ) Тогда ОтменитьТранзакцию();
может вполне отменить некоторую другую транзакцию.
Для предотвращения этого введена целочисленная переменная Ж.
Если Ж=2 то значит команда НачатьТранзакцию() прошла успешно и в крайнем случае мы отменим «свою» транзакцию. Если Ж=1 это говорит о том, что команда НачатьТранзакцию() не была успешной (выбросила исключение) и в этом случае мы не будем выполнять ОтменитьТранзакцию(), так как «свою» мы так и не начали.
ЦелоеЧисло Ж;
Ж=1;
НачатьТранзакцию();
Ж=2;
Попытка
ДелаемЧтоТо();
ЗафиксироватьТранзакцию();
Исключение
Если ( ТранзакцияАктивна() И Ж=2)
Тогда ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Тема интересная до чрезвычайности.
Тем более неприятно, какое огромное количество индивидуумов считает своим долгом высказать свои соображения, не имея даже отдалённого представления о предмете.
Кто будет обрабатывать исключение?
Смысл такой — написать код таким образом, чтобы в случае, если исключение происходило в команде (при этом транзакция не начнётся — поскольку — исключение выкидывает) тогда команда выполняться не должна, иначе возможен случай, когда мы откатим транзакцию, которую не мы начинали — т.е. откатим «чужую» транзакцию, которая не была начата в этом программном блоке.
а так?
Если инструкция НачатьТранзакцию() выбросит исключение
то попадаем в блок перехвата исключения и при этом
Если ( ТранзакцияАктивна() ) Тогда ОтменитьТранзакцию();
может вполне отменить некоторую другую транзакцию.
Для предотвращения этого введена целочисленная переменная Ж.
Если Ж=2 то значит команда НачатьТранзакцию() прошла успешно и в крайнем случае мы отменим «свою» транзакцию. Если Ж=1 это говорит о том, что команда НачатьТранзакцию() не была успешной (выбросила исключение) и в этом случае мы не будем выполнять ОтменитьТранзакцию(), так как «свою» мы так и не начали.
«Кукла есть ОДЕВАЕМАЯ девочкой».
«A doll is dressed up by the girl»
На самом деле это переводится как «Кукла есть ОДЕТА девочкой».
А если вам нужно ОДЕВАЕМАЯ тогда «A doll is being dressed up by the girl»
Тем более неприятно, какое огромное количество индивидуумов считает своим долгом высказать свои соображения, не имея даже отдалённого представления о предмете.