#c_sharp #исключения #форматирование
Начал очень часто сталкиваться с конструкциями try / catch, обычно оформляю их так: try { //Много кода } catch (Exception e) { //Много кода } Теперь, скажем у меня что-то вроде: try { double.Parse("a"); //Тут только одна строчка } catch (ArgumentException e) { //Ничего не делать } Будет ли плохо, если я напишу это так: try { double.Parse("a"); } catch (ArgumentException e) { } Или так: try { double.Parse("a"); } catch (ArgumentException e) { } Ну или например, вместо: try { return Convert.ToDouble(input); } catch (Exception e) { return default(int); } Написать: try { return Convert.ToDouble(input); } catch { return default(int); } Просто заметил, что очень часто try / catch проверяющий одну - две строки занимает по факту целых 8 - 9 и захотелось узнать, как можно в таких случаях поступить?
Ответы
Ответ 1
Да, обработка ошибок — это очень сложная часть программирования. Да, она часто требует большого объёма кода, и это нормально. Вы не должны пытаться уменьшить объём кода, ухудшая качество кода и экономя на обработке ошибок. Целью написания кода является правильный код, а не маленький код по объёму. По поводу оформления кода отступами/переносами строк, придерживайтесь стиля, принятого в вашей команде. Никаких рекомендаций по этому поводу нет. Я бы не экономил строчки путём втискивания кода в одну строку, но это вопрос личных предпочтений. А вот от игнорирования ошибок я бы вас предостерёг. Код наподобие try { double.Parse("a"); //Тут только одна строчка } catch (ArgumentException e) { //Ничего не делать } который просто проглатывает ошибку, скорее всего написан плохо: вместо того, чтобы выявить ошибку в другой части программы, мы просто закрываем на неё глаза, не думая о том, как же будет вести себя программа в исключительном случае. (Ну и в случае, когда исключение имеет хорошие шансы возникнуть и ошибки стоит ожидать, предпочтительно пользоваться функциями наподобие TryParse. Оставьте исключения для исключительных ситуаций.)Ответ 2
В любой подобной ситуации с вопросом форматирования: В главную очередь смотрим стандарты, принятые в команде разработчиков вашего проекта. Если там не решения нашли — обращаемся к Сode conventions. P.S. Мартин Роберт советует: если вы пишите блок try-catch, это повод задуматься о том, не нужно ли что-то здесь выделить в новый метод.Ответ 3
Исключения должны использоваться для обработки внештатного(исключительной) поведения, связанного с неожиданной ошибкой. Они не должны служить заменой проверкам выполнения условий. Если исключения можно избежать, просто проверив какое-то условие перед выполнением действия, то стоит так и сделать. Исключения следует приберечь для настоящих ошибок. Например есть такой метод public double getValueForPeriod(int periodNumber) { try { return values[periodNumber]; } catch(ArrayIndexOutOfBoundsException e) { return 0; } } Заменим выбрасывание исключения проверкой условия public double getValueForPeriod(int periodNumber) { if (periodNumber >= values.length) { return 0; } return values[periodNumber]; } Простой условный оператор работает быстрее чем проверка исключения и иногда может быть очевиднее блока обработки исключения.Этот процесс называется рефакторинг кода. Порядок рефакторинга Создайте условный оператор для граничного случая и поместите его перед try/catch блоком Переместите код из catch-секции внутрь этого условного оператора. В catch-секции поставьте код выбрасывания обычного безымянного исключения и запустите все тесты. Если никаких исключений не было выброшено во время тестов, избавьтесь от оператора try/catch. В вашем примере можно double.Parse("a") заменить таким образом double result; string st="а"; bool retVal= double.TryParse(st,result); if(retVal) { //ваш код } Про обработке исключений можете читать здесь
Комментариев нет:
Отправить комментарий