Описание Robot
Релизы

Как отлавливать ошибки

Введение

При создании workflow разработчик часто должен предусматривать различные ситуации и уметь их обрабатывать. Если есть возможность заранее предугадать возможное поведение программы, то желательно такой сценарий явно обрабатывать. Например, при попытке переместить файл из одной папки в другую может быть такое, что самого файла на самом деле не существует. Такой сценарий (в зависимости, конечно, от характера бизнес-процесса) обычно можно предугадать. А, значит, и обработать соответствующим образом (например, перед копировать добавить проверку наличия файла).

Однако бывают исключительные ситуации. Иногда их нельзя предугадать, иногда предугадать можно, но при этом слишком трудоемко обрабатывать отдельно. Например, при автоматизации какого-либо приложения через интерфейс может произойти такое, что какой-либо элемент (допустим, кнопка) будет слишком долго грузиться или не грузиться вовсе. В таком случае, когда придет очередь взаимодействовать с таким элементом, возникнет исключение, так как робот не сможет найти этот элемент за заданное время. В некоторых особых ситуациях это можно обработать отдельно. Однако если Ваш алгоритм состоит, например, из цепочки последовательных кликов или вводов с клавиатуры, то обрабатывать каждый такой сценарий достаточно громоздко и трудоемко. В таких случаях принято объединять такие блоки в подпрограмму и обрабатывать возможную ошибку на уровне подпрограммы.

Механизм обработки

В каждом блоке в платформе возможно указать поведение робота при возникновении ошибки в данном блоке. Логику действий робот возможно построить проведение стрелки из порта "Ошибка" (отображается красным цветом):

При возникновении ошибки в данном блоке робот продолжит соответствующие действия. Например, если данный сайт перестал отвечать, робот может открыть другой:

Пример без обработки исключения

Допустим, мы хотим ввести какой-то текст в программу блокнота.

  1. Открываем блокнот любым из известных способов, например, нажать "Win + r" - ввести "Notepad" - нажать "Enter".

  2. Переходим в Studio и в рабочее пространство добавляем действие "Ввод с клавиатуры" из группы "Элементы интерфейса".

  3. В параметрах блока "Ввод с клавиатуры" нажимаем "Изменить элемент".

  4. Появляется программа "Desktop Picker", которая позволяет указать поле для ввода текста. Наводим на поле с блокнотом, нажимаем "Ctrl", выбираем атрибуты так, как показано на рисунке ниже, нажимаем на кнопку "Проверить" и убеждаемся, что по данным атрибутам найден именно один элемент.

  5. Нажимаем "OK" в "Desktop Picker" и переходим обратно в среду разработки.

  6. В поле "Значение" вводим произвольный текст, например, Обработка исключений.

  7. Запускаем робота.

Если все было сделано правильно, то робот корректно завершит задачу при открытом блокноте.

Если перед запуском закрыть блокнот, то возникнет исключение (пример на рисунке ниже). Робот остановится. Если после блока "Ввод с клавиатуры" из зеленого порта следовали бы еще какие-либо функции, то они бы не были выполнены.

Пример с обработкой исключения

Теперь добавим обработку исключения для примера выше. Во-первых, нам бы хотелось знать, какая возникла ошибка. Во-вторых, нам бы хотелось выдавать какое-нибудь сообщение с более "дружелюбным" описанием.

  1. Добавим блок "Задать значение переменной" и соединим его с портом "Ошибка" блока "Ввод с клавиатуры".

  2. Убедимся, что на панели справа появились параметры добавленного блока.

  3. В поле "Имя переменной" введем exception и затем выберем "Сохранить результат предыдущего шага" (таким образом, в переменную запишется информация об ошибке).

  4. Следом добавим еще один блок "Лог в консоль", где в качестве сообщения добавим текст Возникла ошибка при работе с блокнотом.

  5. Запускаем workflow.

Теперь мы видим, что вместо красного сообщения об ошибке программа сообщает нам, что workflow успешно выполнен. Мы также видим, что в консоли отобразилось сообщение с текстом для бизнес-пользователя, а на вкладке "Переменные" видно значение переменной exception (текст ошибки).

Пример отлова ошибки, содержащей определённую информацию

Усовершенствуем предыдущий пример обработкой конкретной ошибки, поскольку причиной ошибочной ситуации могут являться различные причины.

Допустим, хотим обработать конкретную ошибку:

Selectors: Ссылка на объект не указывает на экземпляр объекта

Для этого после блока "Сохранить значение в переменную exception" используем действие "Если..то" с условием:

exception.includes('Selectors: Ссылка на объект не указывает на экземпляр объекта')

Теперь, в зависимость от текста ошибки мы можем проводить различную логику действий для робота.

Советы и приемы при обработке исключений

При обработке исключений рекомендуется придерживаться следующих советов и приемов:

  1. Стараться предугадывать возможное поведение робота и, где имеет смысл, обрабатывать каждый сценарий явно.

  2. При использовании порта "Ошибка" часто полезно сохранять в переменную сообщение об ошибке и выводить его в лог. Для бизнес пользователя можно предусмотреть более понятное сообщение об ошибке.

  3. В некоторых ситуациях имеет смысл часть workflow выделить в подпрограмму, внутри которой не осуществлять обработку исключений. Для обработки исключений лучше воспользоваться портом "Ошибка" из блока подпрограммы.

  4. Хорошей практикой в некоторых случаях является отлавливание исключения и возвращения workflow на исходную позицию для повторного прохода. Например, если workflow подразумевает перенос данных из набора документов в программу, то хорошим решением при возникновении исключения на какой-либо из итерации будет закрытие программы (или принудительное завершение) и возврат к начальному состоянию workflow, чтобы повторно обработать этот документ или перейти к следующему.

  5. В отдельных случаях пользователь может сам сгенерировать исключение. Для этого можно воспользоваться блоком "Выполнить код JS", где прописать throw new Error("Здесь содержится желаемый текст, который отобразится при возникновении данного исключения")