Для начала, строим тестовый Job для проверки собственных идей. У меня Ax2.5, поэтому логика может несколько отличаться в старших версиях.
X++:
static void test_TryCatchTransaction(Args _args)
{
;
try
{
ttsbegin;
ttsbegin;
throw exception::Deadlock;
ttscommit;
ttscommit;
}
catch (exception::Break)
{
info('exception::Break');
}
catch (exception::DDEerror)
{
info('exception::DDEerror');
}
catch (exception::Deadlock)
{
info('exception::Deadlock');
}
catch (exception::Error)
{
info('exception::Error');
}
catch (exception::Info)
{
info('exception::Info');
}
catch (exception::Internal)
{
info('exception::Internal');
}
catch (exception::Sequence)
{
info('exception::Sequence');
}
catch (exception::Warning)
{
info('exception::Warning');
}
info(strFmt("Количество вложенных транзакций = %1", appl.ttsLevel()));
}
Как и положено, исключение "выбрасывает" код на самый верхний уровень транзакции, автоматически откатывая все вложенные транзакции. Точнее, на обработчик Try..Catch внутри которого и расположена инициализация самого верхнего уровня транзакции. Все вложенные Try..Catch при этом игнорируются.
Однако возникают следующие вопросы:
Находятся ли команды по началу и завершению транзакции в одном методе? Внутри одного Try..Catch? По крайней мере, вызов методов по началу и завершению транзакции?
Не возникает ли ситуации, когда после выброса на верхний уровень транзакции команда по завершению транзакции оказывается вне обработчика Try..Catch?
Т.е. надо отследить вот такие программные конструкции
X++:
static void test_TryCatchTransaction(Args _args)
{
;
try
{
ttsbegin;
throw exception::Error;
}
catch (exception::Error)
{
info('exception::Error');
}
// Вот здесь возникнет ошибка
ttscommit;
}