Задача.
Имеем стандартный метод, из которого возможен выброс исключения.
Необходимо обработать (успешно, не успешно - не важно) этим методом все строки.
Если получилось обработать все строки успешно (без исключений), то подтвердить транзакцию, иначе откатить все, даже успешно обработанные строки.
Решение.
Идея такая: Этап первый "оптимистический". Открываем транзакцию и строка за строкой выполняем обработку в надежде на то что исключений не будет. Если все получилось закрываем транзакцию.
Этап второй "ловим исключение". Помещаем транзакцию, описанную в первом этапе в блок try-catch. При возникновении исключения транзакция откатится и мы узнаем об этом.
Этап третий "зацикливаем". В случае поимки нами исключения повторяем для оставшихся строк первый и второй этап, но уже без подтверждения транзакции даже в случае успеха.
X++:
enumerator = Lines.getEnumerator()
first = true;
do
{
toBeContinued = false;
try
{
ttsbegin;
while (enumerator.moveNext())
{
stdClass.exceptionWarinigMethod(enumerator.current())
}
if (first) ttscommit;
else ttsabort;
}
catch
{
toBeContinued = true;
}
first = false;
}
while (toBeContinued)