Navrhový vzor či best practices

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Pavel522 29. 5. 2015 10:52

Dobrý den,
potřeboval bych radu s jedním problémem, který často řeším a zatím se mi nepodařilo najít elegantní řešení, případně alespoň navést na správnou cestu.
Často se s problémem setkávám při využití nějakého API, ale určitě se to dá napasovat i na jiné služby. V podstatě se jedná o to, že často z různých API padají výjimky, které nic neznamenají a stačí opakovat metodu a vše proběhne v pořádku. Jsou to takové globální výjimky jako API error, connection close, connection timeout. No prostě nic neříkající a jediné co je potřeba udělat je zavolat metodu znovu a vše proběhne 90% v pořádku. Vyvolat tyto výjimky může libovolná metoda a ošetřovat to v každé metodě volající API je neefektivní a hlavně je to furt to samé do kola.
V podstatě hledám nějaký návrhový vzor nebo best practices jak tohle řešit. Když to řeknu jednoduše, potřebuje veškeré metody volající API obalit a pokud vypadne výjimka a bude z těch, které není potřeba řešit, tak zavolat metodu, která tuto výjimku vyvolala se stejným nastavením proměnných.
Snad je pochopitelné co myslím..:D.
Děkuji za každou radu, nejlépe odkaz na nějaký zdroj s řešením v C# nebo nějaké obecné řešení.
Pavel522
Junior

Odeslat příspěvekod Nargon 29. 5. 2015 15:40

Co třeba takto:
Kód: Vybrat vše
        public static T Runner<T>(Func<T> funcToRun)
        {
            int counter = 5;
            while (counter > 0)
            {
                try
                {
                    return funcToRun();
                }
                catch (ArgumentException) { if (--counter == 0) throw; }
                catch (NullReferenceException) { if (--counter == 0) throw; }
            }
            throw new Exception("Tohle asi nikdy nenastane, ale co kdyby :)");
        }

Odchytává to vyjímky ArgumentException a NullReferenceException (zadat si můžeš jaké chceš, záleží jaké vyjímky považuješ za lehké chyby co se opraví znovu odesláním příkazu), po kterých se to pokusí spustit znovu (celkem to funkci zkusí zavolat 5x), pokud nastane jiná vyjímka tak ta se dostane dál okamžitě. Pokud ani na pátý pokus to neproběhne korektně tak to pustí dál tu vyjímku na kterou to spadlo.
Použití pak takto:
Kód: Vybrat vše
        public static int Metoda(int a, int b)
        {
            return a + b;
        }

        static void Main(string[] args)
        {
            int x = Runner(() => Metoda(2, 3));
            Console.WriteLine(x);
        }

Nikdy jsem to nepotřeboval, asi používám bezchybné api nebo lepší internet :) ale tohle jsem tak zkusil vyplodit a vypadá to že by ti to mohlo fungovat.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod mracka michal 1. 6. 2015 08:37

Pri opakovanom volani je dobra prax pockat nejaku kratku dobu pred dalsim opakovanim. Najlepsie je ked sa cas po kazdom opakovani predlzi 1,5 - dvojnasobne + nejaka male nahodne vygenerovane cislo.

napr. ked zacinam, nastavim t = 250 (ms) a zavolam funkciu bez cakania. V kazdom dalsom pokuse potom t = t * 2 + Random(0,250) a cakam pred opakovanym volanim.
„You don't need a reason to help people.”
~Zidane Tribal, Final Fantasy IX
--
Pouzivam suborovy manazer Nomad.Net.
mracka michal
Junior
Uživatelský avatar

Odeslat příspěvekod Pavel522 1. 6. 2015 10:11

Zdravím,
děkuji za radu. Doufal jsem teda, že na to existuje nějaký návrhový vzor. Ale vyzkouším tedy řešení od Nargona.
Mě často vrátí zvláštni exception i Google API, Sklik APi nebo Allegro API. Je to možná tím, že dané API volám v řádech 10 - 100 tisíců i více denně a to občas hodí nějakou tu výjimku, jak jsem psal, protože internet není na 100%, případně trefíš nějaký blbý stav.
@mracka michal: nějaké časování není pro mě žádné řešení. Výjimka může nastat i tak a jenom mně to bude zdržovat operace..;-). Krom toho API mají své limity a když je přepálíš, tak vyhodí výjimku a upozorní tě a dá se to pak ošetřit.
Pavel522
Junior

Odeslat příspěvekod mracka michal 1. 6. 2015 12:03

Nebolo to myslene ako riesenie tvojej situacie, ale ako zbytocne neobtazovat druhu stranu. :hm
„You don't need a reason to help people.”
~Zidane Tribal, Final Fantasy IX
--
Pouzivam suborovy manazer Nomad.Net.
mracka michal
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků