Правильно оформить try / catch

363
16 июля 2017, 09:36

Добрый день, недавно начал очень часто сталкиваться с конструкциями 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 и захотелось узнать, как можно в таких случаях поступить?

Answer 1

Да, обработка ошибок — это очень сложная часть программирования. Да, она часто требует большого объёма кода, и это нормально. Вы не должны пытаться уменьшить объём кода, ухудшая качество кода и экономя на обработке ошибок. Целью написания кода является правильный код, а не маленький код по объёму.

По поводу оформления кода отступами/переносами строк, придерживайтесь стиля, принятого в вашей команде. Никаких рекомендаций по этому поводу нет. Я бы не экономил строчки путём втискивания кода в одну строку, но это вопрос личных предпочтений.

А вот от игнорирования ошибок я бы вас предостерёг. Код наподобие

try
{
     double.Parse("a"); //Тут только одна строчка
}
catch (ArgumentException e)
{
     //Ничего не делать
}

который просто проглатывает ошибку, скорее всего написан плохо: вместо того, чтобы выявить ошибку в другой части программы, мы просто закрываем на неё глаза, не думая о том, как же будет вести себя программа в исключительном случае.

(Ну и в случае, когда исключение имеет хорошие шансы возникнуть и ошибки стоит ожидать, предпочтительно пользоваться функциями наподобие TryParse. Оставьте исключения для исключительных ситуаций.)

Answer 2

Исключения должны использоваться для обработки внештатного(исключительной) поведения, связанного с неожиданной ошибкой. Они не должны служить заменой проверкам выполнения условий. Если исключения можно избежать, просто проверив какое-то условие перед выполнением действия, то стоит так и сделать. Исключения следует приберечь для настоящих ошибок.
Например есть такой метод

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];
}  

Простой условный оператор работает быстрее чем проверка исключения и иногда может быть очевиднее блока обработки исключения.Этот процесс называется рефакторинг кода.

Порядок рефакторинга

  1. Создайте условный оператор для граничного случая и поместите его перед try/catch блоком
  2. Переместите код из catch-секции внутрь этого условного оператора.
  3. В catch-секции поставьте код выбрасывания обычного безымянного исключения и запустите все тесты.
  4. Если никаких исключений не было выброшено во время тестов, избавьтесь от оператора try/catch.

В вашем примере можно double.Parse("a") заменить таким образом

 double result;
 string st="а";
 bool retVal= double.TryParse(st,result);
 if(retVal)
  {
     //ваш код
  }

Про обработке исключений можете читать здесь

READ ALSO
Ошибка при попытке удалить объект через Entiy

Ошибка при попытке удалить объект через Entiy

Не получается удалить объект с использованием EntityЕсть проект ASP

238
Как правильно забрать cookies проставленные в тесте используя jsdom?

Как правильно забрать cookies проставленные в тесте используя jsdom?

Я использую jsdom В тесте я проставил cookiesКак правильно забрать cookies? Если сделать так window

232
Реализация заполнения полей из json-файла в ajax-запросе при нажатии по ссылке

Реализация заполнения полей из json-файла в ajax-запросе при нажатии по ссылке

Как написать ajax-запрос на заполнение полей json-данными

324