Плюсы и минусы TryCatch против TryParse

Каковы преимущества и недостатки использования одного из следующих подходов для вытаскивания двойника из объекта? Помимо личных предпочтений, проблемы, которые я ищу для обратной связи, включают легкость отладки, производительности, ремонтопригодности и т.д.

public static double GetDouble(object input, double defaultVal)
{
    try
    {
        return Convert.ToDouble(input);
     }
     catch
     {
        return defaultVal;
     }
}

public static double GetDouble(object input, double defaultVal)
{
    double returnVal;
    if (double.TryParse(input.ToString(), out returnVal))
    {
        return returnVal;
    }
else
    {
        return defaultVal;
    }
}

Ответ 1

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

В принципе, перейдите с TryParse:)

Кстати, ваш код можно переписать как:

public static double GetDouble(object input, double defaultVal)
{
    double parsed;
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}

Ответ 2

TryParse более эффективен, чем производительность TryCatch.

Ответ 3

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

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

Теперь, если бы они не создали сломанную реализацию Parse в первую очередь, TryParse просто называться Parse.

Ответ 4

TryParse работает быстрее и обычно лучше, но я бы предложил подход TryCatch в рамках фреймворка и back-end-программирования, потому что вы можете дать клиенту дополнительную информацию об ошибке:

public double GetAge()
{
   try
   {
      var input = _dataProvider.GetInput();
      return Convert.ToDouble(input);
   }
   catch(Exception ex)
   {
      throw new MyBackendException(ex);
   }
}