за и против 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;
    }
}
11
задан Jon Skeet 12 March 2010 в 10:05
поделиться

4 ответа

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

В общем, выбирайте TryParse :)

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

public static double GetDouble(object input, double defaultVal)
{
    double parsed;
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}
19
ответ дан 3 December 2019 в 03:35
поделиться

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

4
ответ дан 3 December 2019 в 03:35
поделиться

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

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

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

2
ответ дан 3 December 2019 в 03:35
поделиться

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

public double GetAge()
{
   try
   {
      var input = _dataProvider.GetInput();
      return Convert.ToDouble(input);
   }
   catch(Exception ex)
   {
      throw new MyBackendException(ex);
   }
}
2
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: