плюсы и минусы 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;
    }
}

person Vijesh    schedule 12.03.2010    source источник


Ответы (4)


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

В общем, иди с TryParse :)

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

public static double GetDouble(object input, double defaultVal)
{
    double parsed;
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}
person Jon Skeet    schedule 12.03.2010
comment
ГМ Джон, какова внутренняя реализация tryparse()? Вот так: попробуйте { Parse(); вернуть истину; } поймать (исключение) { вернуть ложь; } - person Sunil; 12.03.2010
comment
TryParse приводит к String (фактически char*), пытается разобрать эту строку на число (путем сравнения символов), затем выполняет различные другие проверки (диапазон и т. д.), чтобы убедиться, что число является правильным типом. Вокруг него нет блока try catch :) - person Ed James; 12.03.2010

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

person Sunil    schedule 12.03.2010

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

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

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

person John Knoeller    schedule 12.03.2010

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

public double GetAge()
{
   try
   {
      var input = _dataProvider.GetInput();
      return Convert.ToDouble(input);
   }
   catch(Exception ex)
   {
      throw new MyBackendException(ex);
   }
}
person onof    schedule 12.03.2010
comment
Вы по-прежнему можете использовать TryParse и создать собственное исключение для неверных данных. На самом деле, вы должны сделать это именно так, если не для чего-то еще. - person Chris Charabaruk; 12.03.2010
comment
Хорошо, но у вас будет только общее сообщение о неверных данных, и вы потеряете информацию о том, почему данные неверны. Информация, находящаяся в InvalidCastException, FormatException или . Программирование на данном фреймворке Хотелось бы как можно больше информации об ошибке. В любом случае, когда неверные данные могут поступать из веб-службы или из хранилища, это не ожидаемое поведение, и должно быть выдано исключение IMO. - person onof; 25.03.2010