...

Обработка ошибок

Тема в разделе "Примеры сценариев", создана пользователем f.nikolaev, 6 сен 2022.

  1. f.nikolaev

    f.nikolaev Участник

    В данной статье будут описаны способы обработки ошибок в:

    • бизнес процессах,

    • Виджетах,

    • Методах API и Обработчиках событий,

    • Действиях в БП.



    Обработка ошибок в Сценариях Бизнес процессов


    При возникновении исключения (ошибки) в Сценарии в Бизнес процессе, последний прекращает свою работу. В Мониторе процессов он выделен красным цветом. На форме процесса можно узнать подробности:

    [​IMG]


    Чтобы узнать об ошибке необходимо открывать Монитор процессов, что не удобно.


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

    [​IMG]


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

    [​IMG]


    Вызвать ошибку в Сценарии также можно вручную, используя инструкцию throw (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/throw).

    Это можно использовать, когда вы, допустим, не получили какие-либо данные и хотите остановить ваш сценарий и бизнес процесс или отправить его по ветке обработки ошибки. При этом функция прерывает работу, блок сценария падает ошибкой, весь код ниже конструкции throw не будет выполняться:

    [​IMG]


    Чтобы сделать оповещение об ошибке в Ленте более информативным, можно добавить в него текст ошибки. Для этого необходимо создать в контексте процесса контекстную переменную типа Строка для сохранения текста ошибки. Далее, перед тем, как пробросить ошибку через метод throw, заполняем контекстную переменную ошибки. Заполненное значение можно использовать для вставки в текст сообщения Оповещения.

    [​IMG]


    Однако при возникновении ошибки не в ваших скриптах, а, допустим, по тайм-ауту времени исполнения блока Сценарий, сработает ветка по Оповещению об ошибке, но текст ошибки будет пустой. Чтобы заполнить текст сообщения ошибки значением по умолчанию можно воспользоваться дополнительным блоком Сценарий:

    [​IMG]

    со следующим кодом:

    [​IMG]


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

    [​IMG]


    Однако, существуют кейсы, когда остановка бизнес процесса, или же переход по ветке обработки ошибок нежелательны. Например, при обработке в циклах в БП, когда нет смысла прерывать весь цикл, но информация об ошибке при этом не должна пропасть.

    Рассмотрим упрощенный случай постановки поручений исполнителям через подпроцесс.

    [​IMG]

    При возникновении ошибки в блоке “Подготовить данные для поручения” в любой из итераций, Сценарий упадет, а все последующие итерации не выполнятся.

    В этом случае необходимо использовать конструкцию try/catch (подробнее здесь: https://learn.javascript.ru/exception). Она позволяет отловить ошибку внутри блока try, и обработать её в блоке catch. При этом сама функция не падает и продолжает свою работу.

    Пример функции подготовки данных для поручения:

    [​IMG]

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

    Обратите внимание, что заполнение контекстной переменной с ошибкой происходит через конкатенацию “+=”, чтобы не перезаписывать значение переменной, а дополнять ее. Переменную, при этом, следует проинициализировать в одном из сценариев вне цикла, чтобы при конкатенации в значение переменной не попадало “undefined”:

    [​IMG]

    Далее в бизнес процессе необходимо проверить значение переменной ошибки на непустое значение в Шлюзе, если ошибки были - оповестить Исполнителя или Администратора:

    [​IMG]



    Резюмируя:

    • используем прерывание в настройках блока Сценарий,

    • добавляем оповещения,

    • для критичных ошибок используем throw new Error,

    • для некритичных ошибок используем try/catch и строковую контекстную переменную с проверкой на непустое значение в шлюзе.




    Обработка ошибок в Виджетах

    Для обработки ошибок в Виджетах в Клиентских сценариях помимо инструкции debugger удобно использовать логирование в консоль. Для этого необходимо в самом начале скрипта сделать объявление:

    [​IMG]

    Теперь можно использовать стандартный метод console.log() и console.error(). Подобным образом можно объявлять window и document для получения доступа к браузерным API.

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

    [​IMG]


    Если у вас используются Серверные сценарии, обязательно оберните вызов серверного метода в конструкцию try/catch (https://learn.javascript.ru/exception). Она позволяет отловить ошибку внутри блока try, и обработать её в блоке catch. При этом сама функция не падает и продолжает свою работу.

    [​IMG]

    Внутри Серверных сценариев для обработки критичных ошибок вы можете использовать вызов throw new Error() (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/throw), при этом выполнение функции прерывается и срабатывает блок catch Клиентском сценарии, весь код ниже конструкции throw не будет выполняться.

    [​IMG]

    Для обработки некритичных ошибок в Серверных сценариях используйте строковую контекстную переменную для сохранения текста ошибки. В Клиентском сценарии, после каждого вызова серверного метода проверяется контекстную переменную на пустое значение и, при необходимости выводите ее значение в консоль. Делать это удобнее, создав специальную функцию logError:

    [​IMG]








    Обработка ошибок в Методах API и в Обработке событий

    Так как в Методах API и Обработчиках событий у нас нет доступа к интерфейсам, единственным способом передачи данных об ошибке являются fetch запросы.

    На эту тему уже есть статья Анатолия Варанкина, в которой описано логирование с использованием приложения - https://community.elma365.com/ru/threads/238/.







    Обработка ошибок в Действиях в БП (сценарии)

    При использовании сценариев в Действиях в БП у нас нет доступа к интерфейсам. Обработка ошибок в данном случае возможна несколькими способами.

    • Для обработки критических ошибок используйте вызов исключения вручную через throw new Error() (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/throw), при этом функция прерывает работу, блок сценария падает ошибкой, весь код ниже конструкции throw не будет выполняться:
    [​IMG]

    • Для некритичных ошибок (которые не должны полностью блокировать выполнение функции) сохраняйте сообщение в специальную контекстную переменную без вызова throw new Error(), данная переменная должна быть настроена как выходной параметр. Для сохранения данных об ошибке используйте условные конструкции и try/catch (https://learn.javascript.ru/exception). Конструкция try/catch позволяет отловить ошибку внутри блока try, и обработать её в блоке catch. При этом сама функция не падает и продолжает свою работу.
    [​IMG]


    После этого ошибку уже необходимо обрабатывать в родительском бизнес процессе:

    • с помощью настройки обработки ошибки блока сценария через дополнительный выход (для критичных ошибок)

    • с помощью проверки значения ошибки на непустое значение в шлюзе (для некритичных ошибок).
    [​IMG]