Универсальное решение по обработке ошибок BAS?



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

    Имеем - проект на 20 функций, в каждой 10-20 действий.

    Вопрос - как можно, красиво и универсально обрабатывать ошибки?

    Это мой первый проект, потому на данный момент, исходя из примеров и документации, для себя вижу пока что одно решение "в лоб":

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

    Получается нужно два типа реагирования на ошибки:

    1. когда точно знаю что элемент на странице обязан быть, а его нет, таким образом можно предположить что веб-ресурс поменял вёрстку, мы пропускаем функцию или совсем стопаем проект, зависит от условий в разных местах.

    2. когда элемент не обязательно должен существовать, и нам нужно просто тихо проигнорировать и идти дальше

    Проблема - если оборачивать каждое действие в игнор, это очень сильно увеличит общее количество кода ( блоков ), ухудшит общую читаемость, восприятие и тд.

    Чего хотелось бы - не изобретать велосипед, а сразу сделать правильно. Поделитесь опытом друзья)



  • @centerdevs выполнить код практически любой экшен можно выполнить в нем, и там конструируйте чсто вам хочется и как хочется. Читаемость не сильно повысится, но вам будет понятнее. Игнорировать ошибки это и есть универсальный обработчик вы замечали что он в консоль выводит какая последняя ошибка?, никто не мешает вам дополнить например номером кубика если вы кодите на них или еще что либо. Но читаемость на кубиках это довольно необычно) когда у вас 1000+ действий вы все равно запутаетесь.
    upd Самый простой способ на кубиках это выносить из main все второстепенное в отдельные функции. тогда будет хоть как то понятнее типа такого



  • @f0cus

    воу! то есть можно из "выполнить код" вызывать весь функционал БАС? я даже не знал об этом, я так и делал как у Вас на скрине, это все ровно достаточно не удобно, действительно.

    Как я понимаю, https://raw.githubusercontent.com/bablosoft/BAS/master/Engine/text/apilist.txt это список всего функционала который нам доступен для работы из кода? Вы не могли бы показать пример кусочка кода своего, как это +- организовано? Или возможно где-то есть видео-текст мануал который я пропустил, где приводится пример такой работы.



  • @centerdevs https://community.bablosoft.com/topic/6815/aurora-v1-1-0-новая-версия-библиотеки
    Там есть api баса. Но учтите вам нужно сразу внимательно почитать по форуму все темы с запросом асинхронные функции иначе будет много непоняток.
    Такого примера нет, потому что это как бэ не заявляется. Но работает. Кубики это для тех кто не имеет навыков программирования. Есть еще создать в конструкторе, почему то не очень популярно а экшен вполне себе рабочий.
    upd Да учтите главное бас понимает ecmascript 262 никаких ecmdscript 8 -7 10 только ecmascript 262.



  • @f0cus said in Универсальное решение по обработке ошибок BAS?:

    ecmdscript 8

    Вот это я очень важный этап пропустил когда приступил к созданию проекта)) Походу сейчас буду переписывать все свои кубики в код)

    Поискал по форуму, не нашел живых примеров организации такой работы, понимаю что каждому удобно по своему.

    Но, как в идеале опытным путём организовывать работу через код, как делать отладку?

    Какие варианты вижу:

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

    2. Разделить код на некоторые функциональные части, ака Функции на кубиках. То есть мы получим вместо одного файла, допустим 5 файлов "Выполнить код", например Регистрация, Подтверждение, Логин, Парсинг, Постинг. И там уже будет код отвечающий за эти действия.

    Каким образом делаете Вы и почему?)

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



  • @centerdevs Сначала? да со временем вы набьете руку и будете вызывать их напрямую без тестирования обращаясь через api. Начните с простого. Перенесите одно действие в выполнить код, посмотрите как работает, второе, и так далее. Вам просто нужно будет поиграть с басом. Понять как он работает. все section_ что то вас не интересуют. только сами действия. Не надо сразу запрашивать из кода через клиента=) или открывать страницу это асинхрон. С ними у вас еще будет возможность 'пообщатся').
    Через кубик логирование тоже возможно. log() никаких console.log(). Ну если вы не во встроенном языке в ноде все как в ноде 8.6.0 и она отдельная тема.
    upd маленькие var что_то в записи пойдут дальше, в запуске нет. При выполнении всех асинхронов маленькие var обнуляются. Т.е если у вас в коде что то асинхронное и потом будут действия то переносите через [[]] Можете массивы можете объекты можете JSON бас со всем эти прекрасно работает.



  • @centerdevs, не стоит писать весь скрипт в "Выполнить код", могут возникнуть проблемы куда серьезней чем "Как обработать ошибки"



  • @GhostZ c._Break ?) Да оно самое.



  • @f0cus, ну например утечка памяти забивающая 32гб озу за 5 мин



  • @GhostZ Бывает. я что бы такого не было response и request все равно разношу по разным выполнить код. и да по моему сборщик мусора у баса включается только после кубика. но это не точно.



  • Большое спасибо за советы друзья)

    +- всё понял, но пока что полная картинка не вырисовалась как сделать по людски, возможно кто-то может поделиться неактуальным проектом у которого достаточно большой код и который организован именно на Выполнить код а не на кубиках, это было бы лучшим примером ) Рыскаю по всему форуму, те проекты что выкладывают участники, все на кубиках.

    Я так понимаю текущий проект переделывать ради кода нет смысла всё таки. Есть смысл дальше по мере увеличения проекта внедрять именно код а не кубики.

    Тогда вопрос по работе с ошибками остается открытым)

    alt text

    Как можно игнорировать все ошибки?) не пропуская при этом следующие действия, чтобы я хотя бы в нужных местах мог поставить исключения, а там где это неважно мог бы просто игнорировать?)

    В текущем примере при любой ошибке в Register, дальше дело не пойдет, повторюсь у меня в реальном проекте много действий, если каждое оборачивать в Игнор ошибок, это будет немного неудобно, разве нет простого решения этому?)



  • @centerdevs Лучше игнорировать ошибки устанавливайте не на функции, вы просто не поймете что там было, а на действия. в самих функциях. Т.е найти какой то элемент например или загрузка url и вот его оборачивайте. Что бы это не выглядело в кубиках очень уж страшно у баса есть вот это
    2020-02-10_130542.png

    Вы же пишете код с нуля и шаблона нет потому каждое можете конечно заморочится и написать модуль с обработкой ошибок установить его и пусть обрабатывает. Но штатно только так. Это не сильно заморочит кубики можно комментировать и можно сворачивать. Как на скрине выше.



  • @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)
             
          })!
          
    
       }
    

    Сделал пару тестов методом тыка, при ошибке все ровно обработка дальнейшая прекращается, тут разве что делать какую-то функцию/класс обёртку.

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



  • Вот список функций доступных к обращению, и главный вопрос )) Как организовать 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 глобально.


Log in to reply