IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:16.7.2016 18:18

Zdravím. Rád bych věděl, co přesně znamená, když mi při debuggování Visual Studio zahlásí neošetřenou výjimku. Znamená to, že k té výjimce došlo, nebo že k ní může dojít? Např. IndexOutOfRan­geException se zahlásí v případě, že index je skutečně mimo hranice pole v tom konkrétním případě, kdy se debugguje, nebo že MŮŽE být mimo hranice pole (např. při nesprávném čtení ze souboru, uživatelském vstupu apod.). Děkuji.

 
Odpovědět
16.7.2016 18:18
Avatar
Marian Benčat:16.7.2016 20:08

Visual Studio umí breakpoint vykonávání programu u dvou různých situací:

  1. Vyhození výjimky - tj v okamžiku kdy se dojde ke kódu obsahující "throw".. třeba pokud se koukneš do implementace nějakého pole, tak se tam děje něco vzdáleně podobného tomuto:

if (index>=array­.count) throw new IndexOutOfRan­geException() tedy ihned jakmile se snažíš přistoupit k prvku pole, se vyvolá tato výjimka

  1. Druhá situace je neodchycená výjimka, tedy taková výjimka, která není nikde v kódu ošetřena try..catchem,.. tedy doputuje "až úplně nahoru". Takováto výjimka bude mít za následek pád programu (případně třeba vlákna)
Editováno 16.7.2016 20:08
Nahoru Odpovědět
16.7.2016 20:08
Totalitní admini..
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:16.7.2016 22:05

dobrá

 
Nahoru Odpovědět
16.7.2016 22:05
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:16.7.2016 22:22

Dobrá. V mém případě k "throw" nedošlo. Jde tedy o druhý případ. Mám tento kód.

///vytvořím si list, do kterého budu přidávat požadované prvky
List<double> listZnamek = new List<double>();

///rozdělím řádek ze souboru, který VŽDY bude obsahovat dva středníky, tedy 3 části, vznikne mi pole o 3 prvcích.
string[] pole = line.Split(';');

///druhý prvek pole také rozdělím a double.Parsuji ho, a přidám do výsledného listu. Tento druhý prvek má také zaručeně správný formát - tedy př. "2,2,1".
for (int i = 0; i < pole[1].Split(',').Length; i++)
                {
                        double y = double.Parse(pole[1].Split(',')[i]);
                        listZnamek.Add(y);
                }

A i přes to mi stále vyskakuje IndexOutOfRan­geException. Nejdřív jsem byl zmaten a myslel jsem, že VS si myslí, že v kódu MŮŽE dojít k chybě, při jiném vstupu, zkusil jsem try-catch, pak se ale přeskočilo do catch, a to nelze dopustit. Aby bylo rozuměno - vstup je čten ze souboru, který zapisuje program. Ve formátu není chyba. Za proměnnou line si domyslete např. tvar "6;2,2,1;M" .

Tušíte proč mi stále vyskakuje chyba?

 
Nahoru Odpovědět
16.7.2016 22:22
Avatar
Marian Benčat:16.7.2016 22:32

jste si jistej, ye vam nevyskakuje treba na te radce, kde parsujete double? ;-) ukazte stacktrace

Nahoru Odpovědět
16.7.2016 22:32
Totalitní admini..
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:16.7.2016 22:42

Pardon, VS hlásí SystemFormatEx­ception, jak říkáte při double parsování. Z toho ale nejsem o moc moudřejší. Formát by měl být v pořádku - v případě des. čísla jsem zkoušel 1.5 i 1.5d.

 
Nahoru Odpovědět
16.7.2016 22:42
Avatar
Marian Benčat:16.7.2016 22:46

záleží také na nastavení culture.. v některých bere desetinnou čárku jako decimal delimiter. Tudíž si myslí, že double je celé "2,2,1".

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
16.7.2016 22:46
Totalitní admini..
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:16.7.2016 23:05

tak jste na to kápnul, jsem vám vděčný :D
mohla za to ta tečka. V nějakém tutoriálu tady jsem ale četl, že des. čárka je v C# v každém případě tečka.

Díky moc.

 
Nahoru Odpovědět
16.7.2016 23:05
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 8 zpráv z 8.