Pohodový přivýdělek, PHP a MySQL, 350 Kč/hod. z domova. Chceš? Klikni pro více info.
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 Stastny
Redaktor
Avatar
Odpovídá na joell
Petr Stastny: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
Marian Benčat
Redaktor
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  +1 27.12.2017 13:36
In Smalltalk, everything is an object, In Clojure, everything is a list, In Javascript, everything is fucking mistake
Avatar
Marian Benčat
Redaktor
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  +2 27.12.2017 13:40
In Smalltalk, everything is an object, In Clojure, everything is a list, In Javascript, everything is fucking mistake
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
Redaktor
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.