Обработка исключений

Принципы обработки исключительных ситуаций

Введение

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

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

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

Каждый блок в "ElectroNeek DevTool" содержит порт "Ошибка". Если из данного порта не проведена ветка, то возникшее исключение в блоке приведет к ошибке и остановке программы. Если же из порта "Ошибка" выходит ветка в какой-либо другой блок, то алгоритм продолжится по данной ветке, и остановки не возникнет.

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

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

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

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

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

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

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

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

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

Селектор поля для ввода в программе "Блокнот"

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

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

Сообщение об ошибке при закрытом блокноте

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

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

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

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

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

  4. Следом добавим еще один блок "Задать значение переменной", где в переменную user_message добавим текст Возникла ошибка при работе с блокнотом.

  5. Запускаем алгоритм.

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

Результат работы алгоритма с обработкой исключения

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

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

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

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

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

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

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