Обертка для сниппета

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
Есть к примеру вот такой код.

Код:
HtmlElement he = instance.GetTabByAddress("page").FindElementById("content");
if (he.IsVoid) return -1;
instance.WaitFieldEmulationDelay();
he.SetValue(project.Variables["post"].Value, instance.EmulationLevel, false);
Как сделать так что бы при ошибке он делал еще к примеру 3 попытки выполнения.
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
Код:
int   count = 0;
RetryLabel:
count++;
if (count > 20)
    { return "УСе";}
 
 
{
  try{
project.SendInfoToLog("Нет данного поля");   
HtmlElement he = instance.GetTabByAddress("page2").FindElementById("content");
if (he.IsVoid)  goto RetryLabel;
instance.WaitFieldEmulationDelay();
he.SetValue(project.Variables["post"].Value, instance.EmulationLevel, false);
  }
  catch(Exception e){
  // code
  goto RetryLabel;
  }
}
Сделал вот так вроде работает.
Но не если ошибка будет в другом месте это сработает?
 
Последнее редактирование:
  • Спасибо
Реакции: Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113
Меня вообще конструкция с goto пугает. Очень редко их встречаю в примерах кода и на всяких stackoverflow.
Кто часто их использует на практике?
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 054
Благодарностей
6 482
Баллы
113

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Сделал вот так вроде работает.
Но не если ошибка будет в другом месте это сработает?
Использовать goto - некомильфо :-)

Я делаю так:
C#:
string url = "http://4pda.ru/";
int count = 1;
int countmax = 3;
try {
    bool goodpage = false;
    while (goodpage == false) {
        project.SendInfoToLog("Загружаем страницу по адресу: " + url + " Попытка: " + Convert.ToString(count), true);
        Tab tab = instance.ActiveTab;
        tab.Navigate(url);
        if (tab.IsBusy)    tab.WaitDownloading();
        HtmlElement he = tab.FindElementByAttribute("p", "class", "copyright11", "text", 0);
        if (!he.IsVoid)    goodpage = true;
        count += 1;
        if (count > countmax) throw new Exception();
        }
    }
catch {
    throw new Exception("Страница " + url + " не была загружена корректно. Совершено попыток: " + Convert.ToString(count - 1));
}
Всегда с разными нюансами. Всё зависит от ситуации.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Использовать goto - некомильфо :-)

Я делаю так:
C#:
string url = "http://4pda.ru/";
int count = 1;
int countmax = 3;
try {
    bool goodpage = false;
    while (goodpage == false) {
        project.SendInfoToLog("Загружаем страницу по адресу: " + url + " Попытка: " + Convert.ToString(count), true);
        Tab tab = instance.ActiveTab;
        tab.Navigate(url);
        if (tab.IsBusy)    tab.WaitDownloading();
        HtmlElement he = tab.FindElementByAttribute("p", "class", "copyright11", "text", 0);
        if (!he.IsVoid)    goodpage = true;
        count += 1;
        if (count > countmax) throw new Exception();
        }
    }
catch {
    throw new Exception("Страница " + url + " не была загружена корректно. Совершено попыток: " + Convert.ToString(count - 1));
}
Всегда с разными нюансами. Всё зависит от ситуации.
при какой ошибке пойдёт по ветке catch?
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
спасибо за ответ. очень информативно
До сего момента вы производили впечатление человека более-менее разбирающегося в программировании. Поэтому подобные вопросы с вашей стороны выглядят как минимум странно.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/exceptions/
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
До сего момента вы производили впечатление человека более-менее разбирающегося в программировании. Поэтому подобные вопросы с вашей стороны выглядят как минимум странно.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/exceptions/
я задам вопрос иначе. Есть ли ситуация, при которой код пойдёт в этом направлении, кроме намеренного вызова исключения в цикле?
 

woober

Client
Регистрация
07.04.2015
Сообщения
211
Благодарностей
123
Баллы
43
Меня вообще конструкция с goto пугает. Очень редко их встречаю в примерах кода и на всяких stackoverflow.
Кто часто их использует на практике?
Как я понял если goto идет вниз кода, например к след.куску, то все ОК, если как у Шивы в начало, то это bad practice
 
  • Спасибо
Реакции: Astraport

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Любая стрелочка от кубика в конечном счёте является goto
 
  • Спасибо
Реакции: Astraport

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
Основная задача вообще что бы при любой ошибке было выполнено несколько попыток выполнения.
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
я бы был благодарен за более подробный ответ. Хочу пополнить свои знания
Выше я давал ссылку на официальную документацию. Там даны развернутые объяснения.
В двух словах, любой ожидаемый сбой в данном случае приведет к вызову исключения: будь то нерабочий прокси, или простое изменение верстки.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113
Когда-то я предлагал добавить в кубик поиска элемента функционал такого ожидания в цикле, когда проверяется наличие элемента, если нет, то ждём заданное время, очередная попытка и так заданное кол-во раз. По истечении таких попыток, уже выход по красной ветке.
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
Когда-то я предлагал добавить в кубик поиска элемента функционал такого ожидания в цикле, когда проверяется наличие элемента, если нет, то ждём заданное время, очередная попытка и так заданное кол-во раз. По истечении таких попыток, уже выход по красной ветке.
Дело несколько в поиске элементов сколько в ошибках которые почему то нельзя пофиксить типа instance.activetab emulationlevel
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
но ничто из этого не вызовет исключение
Вам шашечки, или ехать?
Хотите поумничать - можете начинать, сцена готова.
Только всем наплевать :-)
Код работает? Свою задачу выполняет?

А задавать глупые вопросы с надутыми щеками - много талантов не нужно.
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Когда-то я предлагал добавить в кубик поиска элемента функционал такого ожидания в цикле, когда проверяется наличие элемента, если нет, то ждём заданное время, очередная попытка и так заданное кол-во раз. По истечении таких попыток, уже выход по красной ветке.
Я давно жду когда дадут возможность создаваь свои экшены/кубики. Плагины - это не совсем то.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Вам шашечки, или ехать?
Хотите поумничать - можете начинать, сцена готова.
Только всем наплевать :-)
Код работает? Свою задачу выполняет?

А задавать глупые вопросы с надутыми щеками - много талантов не нужно.
я давно решил для себя не делать поспешных выводов в чём либо, даже если ситуация кажется очевидной. Взглянув на код в первый раз мне показалось, что оборачивать этот код в try catch дело бесполезное. Но как я только что написал, я стараюсь не делать поспешных выводов. Стал думать об альтернативе. Альтернатива в голову пришла всего одна и довольно банальная: я просто чего-то не знаю и в каких-то ситуациях этот код может выдать исключение.
Вот и всё. Я следую альтернативе и пытаюсь выяснить в каких ситуациях возможен вылет. Так в чём же глупость моих вопросов?
 
  • Спасибо
Реакции: SergSh и Yuriy Zymlex

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113
пытаюсь выяснить в каких ситуациях возможен вылет.
Единственное, что на ум приходит - это редкая ошибка обращения к instance.ActiveTab.
Взглянув на код в первый раз мне показалось
Тут на многие сниппеты глянешь и не то покажется, всё же не форум программистов.:bn:
 
  • Спасибо
Реакции: doc

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
я давно решил для себя не делать поспешных выводов в чём либо, даже если ситуация кажется очевидной. Взглянув на код в первый раз мне показалось, что оборачивать этот код в try catch дело бесполезное. Но как я только что написал, я стараюсь не делать поспешных выводов. Стал думать об альтернативе. Альтернатива в голову пришла всего одна и довольно банальная: я просто чего-то не знаю и в каких-то ситуациях этот код может выдать исключение.
Вот и всё. Я следую альтернативе и пытаюсь выяснить в каких ситуациях возможен вылет. Так в чём же глупость моих вопросов?
Обвязка try catch finally как раз и была придумана для того чтобы избежать ситуаций с поиском черной кошки в темной комнате. Нет, можно, конечно обрабатывать все варианты ошибок отдельно, но, на мой взгляд, это время можно потратить с большей пользой.

@Zymlex, ни разу не сталкивался с ошибкой доступа к instance.ActiveTab, хотя слышу о ней постоянно.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63
Вроде так можно
Код:
for(int i = 0; i < 3; i++)
{
    HtmlElement he = instance.GetTabByAddress("page").FindElementById("content");
    if (he.IsVoid)
    {
        Thread.Sleep(3000);
        continue;
    }
    instance.WaitFieldEmulationDelay();
    he.SetValue(project.Variables["post"].Value, instance.EmulationLevel, false);
    break;
}
 
  • Спасибо
Реакции: Astraport и woober

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)