Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Как правильно оформлять try / catch в коде?

#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) { //ваш код } Про обработке исключений можете читать здесь

Комментариев нет:

Отправить комментарий