Loading...
Nexus avatar Nexus 119 Точки

OOP Exception Handling - Enter Number question.

Привет,

Моля за малко помощ.

http://pastebin.com/TQ23HzNT

Получава се някаква странно за мен завъртане на логиката.

при дебъгване с Ф11 на около 28-мото :) натискане и при въвеждане на вход по-голям от 100, минава през return num, стига до скобата (да излиза от ReadNumber) и отново се връща в catch(ArgumentOutOfRangeException). Някак си е странно.

Моля някой ако може да го обясни с няколко думи. Интересува ме защо се получава така а не как да го оправя ...

Поздрави,

А.

 

Тагове:
0
C# OOP Basics
quickben avatar quickben 966 Точки

Пробвах колега при мен не се получава такова животно(засега), но е силно препоръчително да не handle-ваш exception-ите там където ги хвърляш или на Български език: метода хвърля exception-a, а самия try-catch трябва да е в Main(), отделно не е добре да се използват exceptionite за control-flow логика :) Ще го помъча още 5 минути и ако се получи при мен и видя от къде/защо става така ще пиша. Успех :)

0
Nexus avatar Nexus 119 Точки

Привет,

мерси за съвета. Ще го преработя като разбера какво точно става ...

Пробвай без да дебъгваш. Рънни, въведи за вход число над 100 и след него две последователни други под 100, за да не те хваща outofrange exception-a.

Странно е как запомня числото над 100 или поне пътя по който го търси с Ф11 ...

Поздрави,

 

А.

0
29/05/2015 11:35:04
quickben avatar quickben 966 Точки

Случи се при втория опит много е странно да, нямам идея защо става така, но сега разбрах защо хората са казали да не го използваме за control-flow-mechanism, ще разпитам този и онзи ако уцелим ще драсна 1 ред :)

edit: Exceptions are basically non-local goto statements with all the consequences of the latter, сиреч ако се използват като control flow mechanism рано или късно ще стане някой бъг затова не е хубаво да ги използваме по-този начин, а защо точно става така ще трябва някой с по-задълбочени познания да каже, ако инесеш от catch блока викането на  ReadNumber(start, end); във едно finally мисля, че няма да се получи така, но съм го тествал 1 път и това неотговаря на основния въпрос :)

почвам да си правя изпити по ООП, че имаме поправки ще следя темата с интерес :)

0
29/05/2015 11:58:51
Nexus avatar Nexus 119 Точки

Като допълнение...

Бъга ще е StackOverflowException както отбеляза a_rusenov а причината е, че всеки път при викане на метода стака се пълни с ново ентри на метода и така в един момент ако се въвеждат само >100 числа ще се препълни.

Така си го превеждам аз .

Поздрави,

А.

0
Filkolev avatar Filkolev 4482 Точки

С рекурсията е така, трудно се хваща логиката при дебъгване. Ще трябва да гледаш и call stack-a, за да схванеш какво се случва. Вероятно се получава така, че единият от извиканите методи приключва изпълнението си, връща резултата, и вече метода, който го е извикал (понеже е рекурсия пак става дума за същия метод), гърми заради невалидни данни.

0
a_rusenov avatar a_rusenov 1103 Точки

Отвори си call stack от прозорците за дебъгване и проследи с F11 какво се случва при всяко влизане в ReadNumber(). 

Иначе относно програмата - ако съм разбрал правилно, целта ти с рекурсивното извикване на ReadNumber() е да подканваш потребителят да въвежда, докато не уцели валидно число. Това е грешно, защото всеки път, когато извикваш един метод, си пълниш стека на програмата и е напълно възможно в един момент да получиш StackOverflowException. Най-добре ползвай един while цикъл с TryParse().

0
Nexus avatar Nexus 119 Точки

Дам. Разбрах го.

Достатъчно беше да проследя какво става в Stack-a.

При първото викане пази числото >100. Вика метода отново като влиза и отново в стака. Това ме беше заблудило, че нулира num а всъщост той си го пази в предишното ентри на стака.

Готино съм го измудрил :)))

Мерси за помощта.

Поздрави,

А.

0
Nexus avatar Nexus 119 Точки

Като благодарност за жокерите все пак не се отказах и я направих както трябва.

Опитах да използвам и почти всичко което сте споменали. Изнесох handle-ването извън метода в който се хвърля, вкарах while  + TryParse(). И най- важното задачата сега работи :)

http://pastebin.com/MpYJwQYB

Поздрави,

А.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.