Является ли возврат неснятого исключения плохой практикой для проверки ввода? - PullRequest
2 голосов
/ 16 марта 2012

Является ли плохой практикой писать методы, которые возвращают неисключенные исключения для проверки входных данных?Метод Validate вернет значение NULL, если вход действителен, или вернет исключение, которое будет выдано, если вход фактически будет отправлен.

public Exception Validate(object input)
{
    if (!SomeParametersMatch(input))
        return new SomeException("Message...");
    if (!SomeOtherParametersMatch(input))
        return new SomeOtherException("Another message...");

    // More cases here...

    return null;
}

Таким образом, вы можете использовать ту же функцию для проверки ввода, отображая ответы пользователю и выбрасывая исключения в коде:

public void Submit(object input)
{
    Exception ex = Validate(input);
    if (ex != null) throw ex;

    // Do whatever action here...
}

Например, если вы используете функции для пометки пробелов, допустимых для щелчка, вы можете вызвать Validate для каждого пробела,помечая их как действительные, если возвращаемое значение не равно нулю.Тогда Submit вызывается только после того, как пользователь фактически щелкнет по пробелу, и выбор будет завершен.Это устраняет дублирование кода, когда вам нужно убедиться, что ввод будет действительным, если вы выберете его.

Я мог бы заставить Validate вернуть пустоту и просто выброситьисключения , но поскольку перехват исключений является большей частью генерации исключений , и Validate будет выполняться на гораздо большем количестве недопустимых входных данных, чем допустимые входные данные, это казалось пустой тратой.Если бы Validate использовалось только тогда, когда пользователь действительно отправлял данные, у меня не было бы проблем с использованием блока try / catch.Но так как он используется для фильтрации данных, представляемых пользователю, в большинстве случаев выбрасывая исключение, только для его обнаружения и удаления, он становится чрезвычайно расточительным.

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Где говорится, что блоки try-catch стоят дорого? Какая польза от возврата исключения от других, бросивших его?

public void Validate(object input)
{
    if (!SomeParametersMatch(input))
        throw new Exception("Message...");
    if (!SomeOtherParametersMatch(input))
        throw new Exception("Another message...");

    // More cases here...

}

public void Submit(object input)
{
    Validate(input);

    // Do whatever action here...
}

Этот код более читабелен и менее запутан. Это именно то, как исключения должны быть использованы. Какими бы ни были затраты на использование блока try-catch, пренебрежимо мало.

0 голосов
/ 16 марта 2012

Валидационные библиотеки, такие как DataAnnotations, - это обходной путь, а не правильный способ обработки проверки пользовательского ввода. Лучший способ - проверить значения из каждого установленного свойства.

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

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

С учетом вышесказанного я бы составил список ошибок валидации в методе валидации, а затем сгенерировал бы исключение, включающее все ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...