плюсы и минусы TryCatch против TryParse - PullRequest
11 голосов
/ 12 марта 2010

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

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

Ответы [ 4 ]

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

В основном, идти с TryParse:)

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

public static double GetDouble(object input, double defaultVal)
{
    double parsed;
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}
4 голосов
/ 12 марта 2010

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

2 голосов
/ 12 марта 2010

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

public double GetAge()
{
   try
   {
      var input = _dataProvider.GetInput();
      return Convert.ToDouble(input);
   }
   catch(Exception ex)
   {
      throw new MyBackendException(ex);
   }
}
2 голосов
/ 12 марта 2010

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

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

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

...