Обучение Урок 5 из 12
Ошибки и повторы
- Цель
- Научиться пропускать необязательные ошибки, перехватывать ожидаемые по коду и повторять ненадёжный шаг несколько раз с паузой
- Время
- 20 минут
Файлы примеров
- errors_retry.flow.json — 6,7 КБ
Что понадобится #
- Студия Tulpar.
- Файл примера
errors_retry.flow.json— положите его в любую папку, напримерC:\Уроки\Ошибки. Другие файлы не нужны: процесс сам обращается к файлам, которых нет, чтобы показать ошибки.
Когда шаг падает, запуск останавливается, а шаг в дизайнере отмечается «Ошибка» с кодом и подсказкой. Так бывает не всегда нужно: файла настроек может не быть, сайт может ответить со второй попытки. В Tulpar для этого три средства.
Шаг 1. «Продолжать при ошибке» #
Откройте errors_retry.flow.json и выберите первый шаг — „Прочитать settings.txt (файла может не быть)“, это
file.readText. В «Свойства» у него отмечено «Продолжать при ошибке»: ошибка шага попадёт в лог как
предупреждение, а запуск продолжится. Переменная settings останется пустой, и следующий шаг напишет, что берутся
значения по умолчанию.

Шаг 2. Перехват ошибки по коду #
Блок control.tryCatch „Файл, которого нет“ состоит из трёх веток:
- „Try“ — шаги, ошибки которых перехватываются: чтение несуществующего файла;
- „Catch“ — выполняется при ошибке. В переменной
error—error.code,error.messageиerror.stepId; - „Finally“ — выполняется всегда, была ошибка или нет.
В „Catch“ условие control.if error.code === 'FileNotFound' отличает ожидаемую ошибку от любой другой:
ожидаемую пишет в лог как предупреждение, остальные снова вызывает шагом control.throw. Так процесс не
скрывает ошибок, которых вы не предусмотрели.
Частые коды ошибок: ElementNotFound (элемент не найден), Timeout (истекло время ожидания), FileNotFound,
FileLocked (файл занят), BrowserError, AppStartFailed, ExpressionError, UserThrow (ошибка шага
control.throw).
Шаг 3. Повтор ненадёжного шага #
Цикл control.while „Повторять, пока не получится“ работает, пока !done && attempt < maxAttempts:
- увеличивает номер попытки
attempt; - в блоке „Попытка“ выполняет ненадёжный шаг: в примере он падает, пока номер попытки меньше аргумента
failUntil(по умолчанию 3), — так имитируется сервис, который отвечает не с первого раза; - если шаг прошёл — ставит
done=true; если упал — пишет предупреждение и ждёт секунду шагомcontrol.delay.
После цикла условие „Получилось?“ либо пишет итог, либо вызывает ошибку: процесс не должен молча завершаться успехом, если работа не сделана.

Шаг 4. Запуск #
- Нажмите «Запуск» (F5) и в окне аргументов — «Запустить» со значениями по умолчанию.
- Запустите ещё раз с
maxAttempts=2: попыток не хватит, и запуск завершится ошибкой.

Что должно получиться #
- Первый запуск успешен. В «Лог» по порядку: предупреждение „Ошибка пропущена (продолжать при ошибке)“,
Настройки: файла нет, берём значения по умолчанию,Ожидаемая ошибка FileNotFound: …,Блок finally выполняется всегда, две строкиПопытка N не удалась: Сервис недоступен …,Попытка 3: успешноиГотово с попытки 3 из 3. - Шаги, ошибки которых перехвачены, отмечены в дизайнере как перехваченные — выполнение продолжилось.
- Второй запуск: после двух неудачных попыток — ошибка
Не получилось: все попытки (2) неудачны, шаг „Получилось?“ отмечен «Ошибка». - Создайте рядом с процессом
settings.txtс любым текстом и запустите снова: предупреждения о файле не будет, а в логе появится его текст.
Повторы в оркестраторе #
Когда процесс работает на роботах, повторяет и оркестратор:
- задание целиком — в настройках процесса «Автоповторов при сбое» и «Пауза перед повтором, мин»: упавшее из-за системной ошибки задание запустится снова;
- элемент очереди — в настройках очереди «Повторов при сбое»: элемент с системной ошибкой вернётся в очередь, а бизнес-ошибка не повторяется и ждёт оператора. Подробно — в уроке Очередь заявок.
Повтор внутри процесса хорош для коротких сбоев (сайт ответил со второй попытки); повтор задания — когда сбой надолго (робот перезагрузился, программа зависла).
Если не получилось #
| Что видно | Что сделать |
|---|---|
| Процесс упал на первом шаге с „файл не найден“ | У шага не отмечено «Продолжать при ошибке». |
| Цикл не заканчивается | В условии control.while должна меняться хотя бы одна переменная — здесь attempt и done. У цикла есть предел итераций (в примере 10) — он защищает от бесконечного цикла. |
В „Catch“ пустой error.code |
Имя переменной ошибки в свойствах блока и в выражениях должно совпадать (error). |
Дальше — урок Публикация и запуск в оркестраторе: процесс уходит из студии на робота.