Показать сообщение отдельно
Старый 18.04.2014, 18:23   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1789 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Задача.
Имеем стандартный метод, из которого возможен выброс исключения.
Необходимо обработать (успешно, не успешно - не важно) этим методом все строки.
Если получилось обработать все строки успешно (без исключений), то подтвердить транзакцию, иначе откатить все, даже успешно обработанные строки.

Решение.
Идея такая: Этап первый "оптимистический". Открываем транзакцию и строка за строкой выполняем обработку в надежде на то что исключений не будет. Если все получилось закрываем транзакцию.
Этап второй "ловим исключение". Помещаем транзакцию, описанную в первом этапе в блок 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)
За это сообщение автора поблагодарили: Ruff (3).