@genericname1
Does this happen specifically when copying something inside BAS? In the script panel where the actions are or from the browser?
What version of BAS are you using?
Please record a video demonstrating the problem so that we can understand what is happening.
Универсальное решение по обработке ошибок BAS?
-
Большое спасибо за советы друзья)
+- всё понял, но пока что полная картинка не вырисовалась как сделать по людски, возможно кто-то может поделиться неактуальным проектом у которого достаточно большой код и который организован именно на Выполнить код а не на кубиках, это было бы лучшим примером ) Рыскаю по всему форуму, те проекты что выкладывают участники, все на кубиках.
Я так понимаю текущий проект переделывать ради кода нет смысла всё таки. Есть смысл дальше по мере увеличения проекта внедрять именно код а не кубики.
Тогда вопрос по работе с ошибками остается открытым)

Как можно игнорировать все ошибки?) не пропуская при этом следующие действия, чтобы я хотя бы в нужных местах мог поставить исключения, а там где это неважно мог бы просто игнорировать?)
В текущем примере при любой ошибке в Register, дальше дело не пойдет, повторюсь у меня в реальном проекте много действий, если каждое оборачивать в Игнор ошибок, это будет немного неудобно, разве нет простого решения этому?)
-
@centerdevs Лучше игнорировать ошибки устанавливайте не на функции, вы просто не поймете что там было, а на действия. в самих функциях. Т.е найти какой то элемент например или загрузка url и вот его оборачивайте. Что бы это не выглядело в кубиках очень уж страшно у баса есть вот это

Вы же пишете код с нуля и шаблона нет потому каждое можете конечно заморочится и написать модуль с обработкой ошибок установить его и пусть обрабатывает. Но штатно только так. Это не сильно заморочит кубики можно комментировать и можно сворачивать. Как на скрине выше.
-
@f0cus Да, получается придется каждое действие оборачивать в игнор) в котором в случае ошибки можно вызывать функцию которая отправляет мне скриншот и информирует. Пока начну так "в лоб" делать, если приду к какому-нибудь адекватному комплексному решению - поделюсь с сообществом. Большое спасибо Вам за разъяснения и все наводки !)
-
Нашёл интересную штуку, при открытом проекте, можно нажать Менеджер модулей, и создать модуль из текущего проекта, таким образом мы получаем все свои кубики, в виде кода, где каждая функция интерфейсная, становится реальной) и с кодом внутри.
Вот пример тестовый
function Login() { _call(function() { _on_fail(function(){ VAR_LAST_ERROR = _result() VAR_ERROR_ID = ScriptWorker.GetCurrentAction() VAR_WAS_ERROR = false _break(1,true) }) CYCLES.Current().RemoveLabel("function") load("googlecom")! log("Неудачно"); load("http://google.com/")! log("Удачно"); },null)! _if(VAR_WAS_ERROR,function(){ log("Произошла ошибка : " + VAR_LAST_ERROR) })! }Сделал пару тестов методом тыка, при ошибке все ровно обработка дальнейшая прекращается, тут разве что делать какую-то функцию/класс обёртку.
А еще нашел кнопку скрипт, которая показывает код всех кубиков в более реальном как оно показывается в кубиках, с ид-шками итд. По сути тот же код что и выше + указание начала конца кубиков и инфо.
-
-
https://community.bablosoft.com/assets/uploads/files/1476381371015-internalapi.pdf
-
https://raw.githubusercontent.com/bablosoft/BAS/master/Engine/text/apilist.txt
Вот список функций доступных к обращению, и главный вопрос )) Как организовать ignore error при работе с ними?
try { load("googlecom")! log("1 Удачно"); }catch (e){ log("1 Неудачно"); } try { load("http://google.com/")! log("2 Удачно"); }catch (e){ log("2 Неудачно"); }Вот так получилось игнорировать ошибку и продолжать выполнение кода, но блок catch не срабатывает при этом.
-
-
@centerdevs Оборачивайте не каждое действие, а зависимые блоки действий, то есть если в одном из них произойдет ошибка, то остальные не будут выполняться. Для более детальной обработки ошибок вы можете создать отдельную функцию, которую будите вызывать после каждого блока игнорирования ошибок.
-
@centerdevs said in Универсальное решение по обработке ошибок BAS?:
Вот так получилось игнорировать ошибку и продолжать выполнение кода, но блок catch не срабатывает при этом.
Этот код неверный, у БАС не все так просто, действия с ! в конце являются асинхронными. Я не буду объяснять как все это работает потому что это плохой путь и не рекомендуется разработчиком БАС.
-
@UserTrue странно, но эту асинхронность сгенерил сам BAS, на скриншоте выше там оригинал того что я экспортировал в модуль.
Так и планирую оборачивать группами которые взаимосвязаны, просто я уже +- нашел все методы для работы через Код, и для организации такой работы мне ведь и в коде нужно как-то игнорировать ошибки и их обрабатывать ) потому стало интересно как это делают собраться, кто работает с БАС через код )
-
@centerdevs said in Универсальное решение по обработке ошибок BAS?:
странно, но эту асинхронность сгенерил сам BAS, на скриншоте выше там оригинал того что я экспортировал в модуль.
Посмотрите внимательный, там где сгенерировал сам БАС нет try/catch у БАС свое api для работы с асинхронностью
-
@UserTrue да, это моя неудачная попытка словить ошибку )
_call(function(){ _on_fail(function(){ VAR_LAST_ERROR = _result() VAR_ERROR_ID = ScriptWorker.GetCurrentAction() log(VAR_ERROR_ID+' '+VAR_LAST_ERROR); }) load("googlecom")! log("1 Удачно"); }, null)! _call(function(){ _on_fail(function(){ VAR_LAST_ERROR = _result() VAR_ERROR_ID = ScriptWorker.GetCurrentAction() log(VAR_ERROR_ID+' '+VAR_LAST_ERROR) }) load("http://google.com/")! log("2 Удачно"); }, null)!Вот таким образом получилось на данный момент ловить ошибку и продолжать работу дальше. Интересно можно ли будет как-то использовать этот _on_fail глобально.
-
@centerdevs нуу. ты можешь использовать лютейший костыль в виде eval. а вообще есть try catch
-
@centerdevs Я повторюсь БАС не заточен для работы через API, вы в итоге потратите кучу времени на танцы с бубном и понимание странных багов, которые скорей всего будут! Лучше учиться строить логику скрипта в соответствии с возможностями БАС
-
@centerdevs said in Универсальное решение по обработке ошибок BAS?:
Добрый день, прошу совета опытных ребят, поделитесь самым рабочим паттерном по работе с ошибками и исключениями.
Имеем - проект на 20 функций, в каждой 10-20 действий.
Вопрос - как можно, красиво и универсально обрабатывать ошибки?
Это мой первый проект, потому на данный момент, исходя из примеров и документации, для себя вижу пока что одно решение "в лоб":
- каждое действие оборачивать в блок "Игнор ошибок" где при ошибке делаем "Скриншот" + отправка мне в телеграмм извещения ( или сервер, не суть ), с указанием места где произошла ошибка в коде, или простое игнорирование.
Получается нужно два типа реагирования на ошибки:
-
когда точно знаю что элемент на странице обязан быть, а его нет, таким образом можно предположить что веб-ресурс поменял вёрстку, мы пропускаем функцию или совсем стопаем проект, зависит от условий в разных местах.
-
когда элемент не обязательно должен существовать, и нам нужно просто тихо проигнорировать и идти дальше
Проблема - если оборачивать каждое действие в игнор, это очень сильно увеличит общее количество кода ( блоков ), ухудшит общую читаемость, восприятие и тд.
Чего хотелось бы - не изобретать велосипед, а сразу сделать правильно. Поделитесь опытом друзья)
Только вы знаете, какие действия на странице важные, а какие нет. Оберните необходимые действия в игнор ошибок, или отключите опцию "Остановить поток, если элемент не найден"

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



А на счёт использования api BAS в действии "выполнить код", приведу скриншот ответа @support :

-
@f0cus said in Универсальное решение по обработке ошибок BAS?:
@Fox Воспользуюсь моментом. @Fox а защиту с нодой исправили? ато я чота этот момент пропустил. И в поиске нет ответа.
Ты про код из действия node js в открытом виде? Быстрее было проверить, чем спрашивать :). С шифровкой кода для ноды были какие то серьёзные трудности, какие именно не помню (не нашёл сходу ответ @support).
Я прятал важные участки кода в переменные BAS и выполнял в ноде через eval() -
Всё понял друзья, большое спасибо за внимание и помощь)
"Остановить поток если элемент не найден" даже не подумал глянуть про такую опцию)
Буду делать дальше тогда в том виде в котором есть, и понемногу копать про nodejs.