Добрый день, недавно начал очень часто сталкиваться с конструкциями 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 и захотелось узнать, как можно в таких случаях поступить?
Да, обработка ошибок — это очень сложная часть программирования. Да, она часто требует большого объёма кода, и это нормально. Вы не должны пытаться уменьшить объём кода, ухудшая качество кода и экономя на обработке ошибок. Целью написания кода является правильный код, а не маленький код по объёму.
По поводу оформления кода отступами/переносами строк, придерживайтесь стиля, принятого в вашей команде. Никаких рекомендаций по этому поводу нет. Я бы не экономил строчки путём втискивания кода в одну строку, но это вопрос личных предпочтений.
А вот от игнорирования ошибок я бы вас предостерёг. Код наподобие
try
{
double.Parse("a"); //Тут только одна строчка
}
catch (ArgumentException e)
{
//Ничего не делать
}
который просто проглатывает ошибку, скорее всего написан плохо: вместо того, чтобы выявить ошибку в другой части программы, мы просто закрываем на неё глаза, не думая о том, как же будет вести себя программа в исключительном случае.
(Ну и в случае, когда исключение имеет хорошие шансы возникнуть и ошибки стоит ожидать, предпочтительно пользоваться функциями наподобие TryParse
. Оставьте исключения для исключительных ситуаций.)
Исключения должны использоваться для обработки внештатного(исключительной) поведения, связанного с неожиданной ошибкой. Они не должны служить заменой проверкам выполнения условий. Если исключения можно избежать, просто проверив какое-то условие перед выполнением действия, то стоит так и сделать. Исключения следует приберечь для настоящих ошибок.
Например есть такой метод
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)
{
//ваш код
}
Про обработке исключений можете читать здесь
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не получается удалить объект с использованием EntityЕсть проект ASP
Я использую jsdom В тесте я проставил cookiesКак правильно забрать cookies? Если сделать так window
Есть массив городов thisstate
Как написать ajax-запрос на заполнение полей json-данными