А есть ли аналог BED END ?



  • Всем привет.
    Подскажите есть ли такая возможность , отловить некорректное завершение скрипта и выполнить код дальше? Иногда не кликает на нужный элемент и прерывается.
    Хотя щас подумал, куда его вставлять , проверку эту..не после каждого действия же. Так же проверять условием каждое действие - это какой код будет)) Как можно реализовать попроще?



  • @gena для этих целей существует блок Игнорировать ошибки http://wiki.bablosoft.com/doku.php?id=ru:how_to_catch_errors, можешь воспользоватся поиском по форуму как этот блок использовать..он не однократно обсуждался здесь)



  • спасибо! я только начал сегодня изучать)



  • @gena советую изучить полностью вики)



  • Тоже понадобился аналог BAD END от Зенки. Подскажите, я все правильно понял?
    Значит просто тупо берем и оборачиваем ввесь скрипт в блок игнорирования ошибок, а в конце через условный оператор отлавливаем наличие ошибки и делаем нужные нам действия? Никаких конфликтов с внутренними блоками игнорирования ошибок, внутри скрипта, не будет?

    http://i.piccy.info/i9/f871fb1a81e6166cdb01293df5545e6e/1504374698/57565/1168708/error_bad_end.png
    alt text



  • @Gang Немного не так - нужно оборачивать в игнор ошибок действия, которые выполняются с ошибкой и потом отлавливать либо IF [[WAS_ERROR]] либо IF [[LAST_ERROR]].
    В [[LAST_ERROR]] можно посмотреть текст последней ошибки и назначить реакцию на эту ошибку. Только потом [[LAST_ERROR]] я обычно очищаю.



  • @Gang блоки конкурировать не будут. Если нужно будет выйти из вну реннего блока игнора во внешний - можно вызвать действие Fail. Игнор отлавливает все фейлы, даже вызванные пользователем



  • @Inwnew said in А есть ли аналог BED END ?:

    @Gang Немного не так - нужно оборачивать в игнор ошибок действия, которые выполняются с ошибкой и потом отлавливать либо IF [[WAS_ERROR]] либо IF [[LAST_ERROR]].
    В [[LAST_ERROR]] можно посмотреть текст последней ошибки и назначить реакцию на эту ошибку. Только потом [[LAST_ERROR]] я обычно очищаю.

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

    @DrPrime said in А есть ли аналог BED END ?:

    @Gang блоки конкурировать не будут. Если нужно будет выйти из вну реннего блока игнора во внешний - можно вызвать действие Fail. Игнор отлавливает все фейлы, даже вызванные пользователем

    Только что сделал эксперимент. Все таки внешний блог игнора, которым оборачиваю ввесь скрипт, конфликтует с внутренними блоками игнора. Вернее [[WAS_ERROR]] возвращает TRUE от внутреннего блока игнора. И в конце скрипта выполняется условный оператор if([[WAS_ERROR]]) со значением true.

    Пока придумал такой костыль. После всех внутренних блоков игнора, делать проверку if([[WAS_ERROR]]). И внутри условия присваиваю [[WAS_ERROR]] = false и дальше в этом условии делаю что мне нужно. То есть после любой внутреней ошибки в блоке игнора, я буду как-бы обнулять [[WAS_ERROR]] и присваивать ему булевое значение false.

    В итоге, если в скрипте возникнет любая ошибка вне локальных блоков игнора, скрипт выйдет в мое финишное условие if([[WAS_ERROR]]) и тут я уже сделаю что мне нужно после ошибки. Например сохраню текущий аккаунт на котором была неизвесная ошибка.



  • @Gang
    скорее всего какая то ошибка у тебя в логике.

    Игнор ошибок
         Загрузить - тут нет ошибки. was_error false
         Игнор ошибок 
               Двигать мишь - тут ошибка
         выкинуло с блока, тут was_error true
         Ввод текста - ошибки нет
    Вышли из блока was_error false, но lasterror содержит предыдущую ошибку
    Условие была ли ошибка
    


  • @DrPrime said in А есть ли аналог BED END ?:

    @Gang
    скорее всего какая то ошибка у тебя в логике.

    Игнор ошибок
         Загрузить - тут нет ошибки. was_error false
         Игнор ошибок 
               Двигать мишь - тут ошибка
         выкинуло с блока, тут was_error true
         Ввод текста - ошибки нет
    Вышли из блока was_error false, но lasterror содержит предыдущую ошибку
    Условие была ли ошибка
    

    Кидаю свои тестовые шаблоны. Проверьте пожалуйста у себя.

    1. Тут есть неизвестная ошибка в теле скрипта. Все отрабатывает как вы и говорите, конфликта нет.
      0_1504382353472_test_bad_end_1.xml

    2. Тут НЕТ неизвестных ошибок в теле скрипта. Но финишный if([[WAS_ERROR]]) все равно выполнится. В нем сохраняется значение от внутреннего блока игнора.
      0_1504382456837_test_bad_end_2.xml

    Нужно универсальное решение. Чтоб при любой неизвестной ошибке отрабатывал финишный if([[WAS_ERROR]]). При этом ошибки которые возникают в теле скрипта и обрабатываются внутренними игнорами, не учитываются.



  • @Gang Да, действительно так. Странно. Хотя у меня много скриптов построены по логике выше. Скорее всего не сталкивался с этим, потому что обычно в обработке внутреннего блока идет например, смена прокси и т.д., после чего идет снова игнор ошибок



  • @DrPrime Выходит мое решение с присваиванием [[WAS_ERROR]] = false после каждого внутреннего игнора верное? Ну чтоб универсальный BAD END сделать? Или есть другие варианты?



  • @DrPrime Ни чего странного здесь нет, в мануале так и пишут:

    Вы можете прочитать переменную WAS_ERROR чтобы проверить, были ли ошибки во время последнего блока «Игнорировать Ошибки».

    То есть это логично, что переменная не обнулилась после выхода из блока игнорирование ошибок, более того, такое поведение было бы странным и не правильным. Ведь не известно, где мне пригодится значение этой переменной.
    @Gang Кто то на форуме уже предлагал @support 'y сделать опцию, игнорирование всех ошибок, но он отказался, потому что надёжнее правильно оформить логику скрипта, чем получить работу скрипта с непонятными данными..
    По большому счёту ошибку может вернуть не так уж и много экшенов. Вы ведь не по координатам кликаете? Да и можно вставить экшен проверить виден ли элемент на экране и тому подобное.



  • @Gang да
    @fox Тут чуть другая логика. Зачем ошибку из внутреннего блока переносить во внешний блок?



  • @Gang Ещё не забывайте, что если в блоке игнорировать ошибки экшен вернёт ошибку, то последующие просто пропустятся.
    0_1504383612853_forum57.png
    Вот ваш же скрипт с этими действиями.



  • @Fox said in А есть ли аналог BED END ?:

    @Gang Ещё не забывайте, что если в блоке игнорировать ошибки экшен вернёт ошибку, то последующие просто пропустятся.
    0_1504383612853_forum57.png
    Вот ваш же скрипт с этими действиями.

    Ну это я все в курсе) Тут штука в том что ошибка от внутреннего блока игнора передается во внешний.



  • @Gang Ну раз вкурсе, тогда не вижу проблему :) Устанавливаете значение переменной вручную после перехода из внешнего игнора во внутренний и по выходу во внешний тоже.

    А вообще интересная тема, надо @support 'a спросить на этот счёт, должно ли менятся значение [[WAS_ERROR]] после перехода из внешнего игнорирования ошибок во внутренний.



  • @Fox Да, это баг, что переменная не обновляется, исправлю завтра.



  • Исправил, будет в следующей.



  • @support said in А есть ли аналог BED END ?:

    Исправил, будет в следующей.

    Спасибо!


Log in to reply