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):
Как видите, куда-то пропали наши сообщения об ошибке. Виноватым является оператор "retry". Он сбрасывает сообщения в Инфологе, начиная с последнего оператора
throw  "throw error ('У вас прорвало батарею')". Нужно как-то заставить Инфолог зафиксировать наши реплики до выполнения "retry". Сделать это можно с помощью глобального метода setprefix. Внесите следующие изменения в блок catch (Exception::Error):
   catch(Exception::Error)
   {
      warning('Исключение ERROR поймано');
      errorFlag = true;
      setprefix('');
      retry;
   }
Теперь все будет нормально:
 
Итог:
оператор retry возвращает исполнение кода в начало блока try.