Здравей,
Когато се хващат 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
Поздрави. : )
Запознат съм с иерархията на изключенията(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(обработени)?
Това с repeat main също не е много добра практика. Смисъл като цяло не случайно main функцията е 1, по - добре вместо така да имаш отделна функция, от която извикваш пак main функцията, да вкараш try - catch блока в един while цикъл, и така просто когато нещо не е наред пак ще се извиква четене от конзолата, проверява се резултата, ако е грешен пак и така. Ако ли пък е верен се излиза от цикъла, според мен така е доста по добре.
Относно съобщенията за exception - ите, за тези два специално, които си казал, може и да става това съобщение, макар че за FormatException може и по - хубаво съобщение да се изкара. Като например, че има невалиден въведен символ да кажем, по - точно обяснява, че грешката е във формата на въвеждането.
Да с някакъв цикъл по-добре става даже някой хора слагат брояч примерно 3 опита, просто я копирах тази функция колкото да правя нещо след като обработя изключението. Мерси за помощта инфо в интернет има доста и с малко практика трябва да ги понауча малко, просто както казах исках мнение от някой от този форум.