Loading...
mbelev avatar mbelev 10 Точки
Best Answer

Здравей,

Когато се хващат exception - ите, не е добра практика да се дава да хване Exception, защото това е най - главния Exception, тоест родителския на всички останали. Трябва да започнеш хващането на exception - ите от най - витрешния exception, така да го нарека. Разгледай за клас иерархията при exception - ите в C#. Във Visual Studio когато застанеш с мишката върху дадено нещо, което правиш, да кажем в случея uint.Parse(...); ти дава какви видове exception - и могат да възникнат. Добра практика е да се хващат всичките възможни такива, като се започва от децата и така до родителските exception - и. Може да имаш повече от 1 catch а не в 1 catch на Exception класа да проверяваш след това дали е такъв или онакъв exception - а. Направо казваш catch(съответния exception) { // do something } ; Тука разбира се набързо не е нито форматирано това, което пиша като код, но просто примерно.

Ето тук един линк може да разгледаш малко: http://msdn.microsoft.com/en-us/library/z4c5tckx(v=vs.110).aspx

Поздрави. : )

 

1
quickben avatar quickben 966 Точки

Запознат съм с иерархията на изключенията(exceptions hierarchy) и последствията от това в control-flow logic-a и също така, че е добре да се обработват (handle) всички "изключения" които са ни в компетенцията просто гледах да го напиша малко по-спретнато и затова написах всички такива exceptions в един if statement nested в catch блок и нарочно оставих ArgumenNullException необработен(unhandled) за да се види явно, че ако има exception и той не е от обработените той си бива хвърлян както нормално и цялata информация(stack trace..) по възникналото изключение си седи на мястото....да реално хванал съм Exception("бащата на изключенията"), но след като програмата е видяла, че този exception не е един от тези които съм предвидил си процедира нормално(остава си unhandled) и по този начин според мен не съм нарушил правилото да не хващам абсолютни всички изключения (Exception = ex") и да не обработвам такива от които неразбирам или не ми е работа. Или аз нещо много се бъркам :)

Мисля , че ако трябва да спазвам правилото всяко изключение в един catch блок трябва да се получи нещо такова, но тази версия си работи по същия начин като другата с изключението, че съм сложил последното възможно(за uint.Parse) изключение и съм дал малко по-специфична информация относно вида изключение макар, че "Please enter a positive number in the range [0 to 4,294,967,295]" според мен си е напълно валидно както за FormatException така и за OverflowException , но щом такива са добрите практики ще се придържам към "всяко отделно изключение в отделен кетч блок" все пак затова е форума. Мерси за отговора, исках друго мнение преди да започна да обработвам изключения :)

btw това, че в случая съм сложил RepeatMain(); функция под предвидените exception-и прави ли ги handled(обработени)?  

0
mbelev avatar mbelev 10 Точки

Това с repeat main също не е много добра практика. Смисъл като цяло не случайно main функцията е 1, по - добре вместо така да имаш отделна функция, от която извикваш пак main функцията, да вкараш try - catch блока в един while цикъл, и така просто когато нещо не е наред пак ще се извиква четене от конзолата, проверява се резултата, ако е грешен пак и така. Ако ли пък е верен се излиза от цикъла, според мен така е доста по добре.

Относно съобщенията за exception - ите, за тези два специално, които си казал, може и да става това съобщение, макар че за FormatException може и по - хубаво съобщение да се изкара. Като например, че има невалиден въведен символ да кажем, по - точно обяснява, че грешката е във формата на въвеждането.

1
quickben avatar quickben 966 Точки

Да с някакъв цикъл по-добре става даже някой хора слагат брояч примерно 3 опита, просто я копирах тази функция колкото да правя нещо след като обработя изключението. Мерси за помощта инфо в интернет има доста и с малко практика трябва да ги понауча малко, просто както казах исках мнение от някой от този форум.

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