суббота, 13 октября 2007 г.

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.