Обучение Урок 5 из 12

Ошибки и повторы

Цель
Научиться пропускать необязательные ошибки, перехватывать ожидаемые по коду и повторять ненадёжный шаг несколько раз с паузой
Время
20 минут

Файлы примеров

Что понадобится #

  • Студия 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:

  1. увеличивает номер попытки attempt;
  2. в блоке „Попытка“ выполняет ненадёжный шаг: в примере он падает, пока номер попытки меньше аргумента failUntil (по умолчанию 3), — так имитируется сервис, который отвечает не с первого раза;
  3. если шаг прошёл — ставит done = true; если упал — пишет предупреждение и ждёт секунду шагом control.delay.

После цикла условие „Получилось?“ либо пишет итог, либо вызывает ошибку: процесс не должен молча завершаться успехом, если работа не сделана.

Цикл повторов: попытка в блоке перехвата и пауза перед следующей
Цикл повторов: попытка в блоке перехвата и пауза перед следующей

Шаг 4. Запуск #

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

Что должно получиться #

  • Первый запуск успешен. В «Лог» по порядку: предупреждение „Ошибка пропущена (продолжать при ошибке)“, Настройки: файла нет, берём значения по умолчанию, Ожидаемая ошибка FileNotFound: …, Блок finally выполняется всегда, две строки Попытка N не удалась: Сервис недоступен …, Попытка 3: успешно и Готово с попытки 3 из 3.
  • Шаги, ошибки которых перехвачены, отмечены в дизайнере как перехваченные — выполнение продолжилось.
  • Второй запуск: после двух неудачных попыток — ошибка Не получилось: все попытки (2) неудачны, шаг „Получилось?“ отмечен «Ошибка».
  • Создайте рядом с процессом settings.txt с любым текстом и запустите снова: предупреждения о файле не будет, а в логе появится его текст.

Повторы в оркестраторе #

Когда процесс работает на роботах, повторяет и оркестратор:

  • задание целиком — в настройках процесса «Автоповторов при сбое» и «Пауза перед повтором, мин»: упавшее из-за системной ошибки задание запустится снова;
  • элемент очереди — в настройках очереди «Повторов при сбое»: элемент с системной ошибкой вернётся в очередь, а бизнес-ошибка не повторяется и ждёт оператора. Подробно — в уроке Очередь заявок.

Повтор внутри процесса хорош для коротких сбоев (сайт ответил со второй попытки); повтор задания — когда сбой надолго (робот перезагрузился, программа зависла).

Если не получилось #

Что видно Что сделать
Процесс упал на первом шаге с „файл не найден“ У шага не отмечено «Продолжать при ошибке».
Цикл не заканчивается В условии control.while должна меняться хотя бы одна переменная — здесь attempt и done. У цикла есть предел итераций (в примере 10) — он защищает от бесконечного цикла.
В „Catch“ пустой error.code Имя переменной ошибки в свойствах блока и в выражениях должно совпадать (error).

Дальше — урок Публикация и запуск в оркестраторе: процесс уходит из студии на робота.