X++: исключения, часть 2
[id:50]
Давайте попробуем по сложнее.
static void BLG50_TryExceptions2(Args _args)
{
boolean errorFlag = false;
try
{
if (! errorFlag)
throw error('У вас прорвало батарею');
throw info('Котлеты в холодильнике. Не забудь покормить кота');
}
catch(Exception::Error)
{
warning('Исключение ERROR поймано');
errorFlag = true;
retry;
}
catch(Exception::Info)
{
warning('Исключение INFO поймано');
}
info('Конец');
}
Новый для вас оператор — retry. Он возвращает точку выполнения программы в начало блока "try". Да, именно в начало "try", а не в точку после строки с генерированным исключением. В нашем случае мы снова вернемся на строчку "if (! errorFlag)".
Чтобы предотвратить зацикливание я ввел переменную "errorFlag"; таким образом, исключение типа error будет сгенерировано только один раз.
Результаты получились неожиданными:
Как видите, куда-то пропали наши сообщения об ошибке. Виноватым является оператор "retry". Он сбрасывает сообщения в Инфологе, начиная с последнего оператора
throw — "throw error ('У вас прорвало батарею')". Нужно как-то заставить Инфолог зафиксировать наши реплики до выполнения "retry". Сделать это можно с помощью глобального метода setprefix. Внесите следующие изменения в блок catch (Exception::Error):
catch(Exception::Error)
{
warning('Исключение ERROR поймано');
errorFlag = true;
setprefix('');
retry;
}
Теперь все будет нормально:
Итог:
оператор retry возвращает исполнение кода в начало блока try.