NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
joell
Člen
Avatar
joell:27.12.2017 13:09

Zdravím,
takový malý dotaz, řekněme, že argument 'val[10]' v uvedeném příkladu vyhodí vyjímku (třeba index mimo rozsah). Normálně to řeším nějak takhle:

try{ foo(val[10]); } catch { .... }
foo(int[] i){ .... }

Zajímá mě, jestli je možné obsloužit vyjímku až v těle funkce, ne ale tak, že bych v catch posílal nějaký identifikátor vyjímky, ale přímo:

foo(val[10]);
foo(int[] i){ .. zde obsloužit.. }

Díky.

 
Odpovědět
27.12.2017 13:09
Avatar
joell
Člen
Avatar
Odpovídá na joell
joell:27.12.2017 13:17

Omluva, ty hranaté závorky tam samozřejmě nemaí co dělat: foo(int i){ ... }

 
Nahoru Odpovědět
27.12.2017 13:17
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na joell
Petr Šťastný:27.12.2017 13:36

Řekl bych, že té funkci budeš muset poslat pole a index. Možná to nějak jde udělat, ale já o tom nevím. Jestli ti tedy nikdo neporadí lepší způsob, šlo by tohle:

static void Foo(int[] pole, int index){
try{
int hodnota = pole[index];
// ...
}
catch{
// ...
}
}

static void Main(string[] args){
   Foo(pole, index);
}
}
 
Nahoru Odpovědět
27.12.2017 13:36
Avatar
Odpovídá na joell
Marian Benčat:27.12.2017 13:36

Jestli si můžu něco zpětně přát k Ježíšku, prosím ať vývojáři konečně pochopí, že výjimka neslouží k chodu programu a k ošetření věcí, které můžeme ošetřit jinak. Výjimky není moc důvod prostě používat, většinou tedy by si je měl mít k ošetření vyhozených exception z knihovny třetí strany.. Navíc, má smysl odchytávat prostě výjimky o kterých víš, že to vyhazuje, tedy třeba IOException u práci s filesystémem atp.

Alespoň nějaké malé základy defenzivního programování prosím..
Ty tu zmiňuješ OutOfBound index s tím, že to posíláš do metody VAL. To je problém ošetřit index pole?

Nahoru Odpovědět
27.12.2017 13:36
Totalitní admini..
Avatar
Odpovídá na joell
Marian Benčat:27.12.2017 13:40

K tvé otázce.. doporučuji se třeba inspirovat třeba TryParse, nebo ještě lépe, IdentityFrame­workem.. Kde ti prostě metody nevracejí T, ale Result<T>, takže máš pak:

X = DO(T); // čistý kod
nebo:
DO(T); // impure, né tak čisté- modifikace parametru
a pak:
if (T.success){
foo(T.data);
}

(nejsme posraté PHP, co nemá ještě v roce 2017 generiku, tak proč ji sakra nevyužít)

Editováno 27.12.2017 13:41
Nahoru Odpovědět
27.12.2017 13:40
Totalitní admini..
Avatar
joell
Člen
Avatar
Odpovídá na Marian Benčat
joell:27.12.2017 14:14

Pochop prosím, že toto je jen ilustrační příklad. VAL není v tomto případě metoda ale název pole. Vyjímka je očekávaná, pole posílá aplikace třetí strany a index mimo rozsah není chyba (taky jsem z toho paf) ale návěstí mimořádného stavu.

 
Nahoru Odpovědět
27.12.2017 14:14
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na joell
gcx11:28.12.2017 19:58

Pokud je to normální pole, nebylo by lepší si zjistit jeho velikost a pak porovnávat, jestli index ve správných mezích?

index < val.Length
 
Nahoru Odpovědět
28.12.2017 19:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.