Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:

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. července 18:18
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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. července 20:08
 
Nahoru Odpovědět 16. července 20:08
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:

dobrá

 
Nahoru Odpovědět 16. července 22:05
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:

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. července 22:22
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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

 
Nahoru Odpovědět 16. července 22:32
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:

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. července 22:42
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 16. července 22:46
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:

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. července 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.