Я согласен с TKK
. Тем не менее, и ответив на ваш вопрос на основе предоставленного кода, я вижу только способ исключить одно из выражений switch в этом методе.
Первый оператор switch будет устанавливать sqlcommand и параметры, а второй останется неизменным в цикле while.
Объявите их в начале вашего метода:
`SqlConnection conn = new SqlConnection("connection string");
SqlCommand cmd = AdoBase.GetSqlCommand("", conn);`
Измените первый оператор switch, чтобы добавить параметры в команду sql:
switch (model.Attribute)
{
case "Users":
sqlCommand = "GeneralUserSearch";
if (!string.IsNullOrWhiteSpace(model.Name))
{
cmd.Parameters.AddWithValue("Name", model.Name);
}
if (!string.IsNullOrWhiteSpace(model.Name))
{
cmd.Parameters.AddWithValue("Username", model.Username);
}
break;
case "Favorites":
sqlCommand = "UserFavorites";
cmd.Parameters.AddWithValue("Favorites", model.Favorites);
break;
case "Email":
sqlCommand = "EmailSearch";
cmd.Parameters.AddWithValue("Email", model.Email);
break;
}
Удалите этот блок кода:
switch (model.Attribute)
{
case "Users":
if(!string.IsNullOrWhiteSpace(model.Name)) {
cmd.Parameters.AddWithValue("Name", model.Name);
}
if(!string.IsNullOrWhiteSpace(model.Name)) {
cmd.Parameters.AddWithValue("Username", model.Username);
}
break;
case "Favorites":
cmd.Parameters.AddWithValue("Favorites", model.Favorites);
break;
case "Email":
cmd.Parameters.AddWithValue("Email", model.Email);
break;
}
И добавьте, наконец, после улова, чтобы очистить объекты соединения и команды:
finally
{
conn.Dispose();
cmd.Dispose();
}
throw
вещи луга?catch()
пункт).Я - немного минималист и только создам пользовательское исключение, если существует код вызова, который должен явно реагировать на конкретное условие, которое произошло. Для всех других ситуаций я буду использовать самое соответствующее исключение библиотеки.NET. Например, ArgumentNullException, InvalidOperationException
Когда необходимо отличить одно исключение от других так или иначе. Вот именно, действительно. Конечно, Вы могли создать класс исключений, который берет перечисление для различения его причины, также.
Это действительно легко видеть, когда Вы хотите передать дополнительную информацию за исключением. Единственная причина передать ту информацию состоит в том, если Вы хотите смочь получить ту информацию позже, и таким образом, Вы захотите знать тип, таким образом, можно будет получить информацию от того типа и не других.
В C++ и возможно некоторых других языках, Вы могли бы также определение типа исключение. Это позволило бы, чтобы тип различал, и возможно будущее преобразование в пользовательский класс.
Как сказанная Езда на заднем колесе мотоцикла, сначала ищите соответствующее исключение платформы и только используйте исключения (особенно пользовательские исключения), где Вы действительно планируете поймать их.
Я использую пользовательский класс исключений, который содержит свойство UserMessage, так, чтобы я мог распространить проблему на простом языке пользователю, если это возможно.
Если Вы используете.NET, выезд, Разрабатывая Пользовательские Исключения. Интересно, документация изменила свою рекомендацию на использовании ApplicationException:
При разработке приложения, которое должно создать его собственные исключения, Рекомендуется получить пользовательские исключения из Класса исключений. Первоначально считалось, что пользовательские исключения должны произойти из класса ApplicationException; однако на практике это, как находили, не добавило значительное значение. Для получения дополнительной информации посмотрите Лучшие практики для того, чтобы Обработать Исключения.
Моей главной причиной для использования пользовательских исключений была бы инкапсуляция с несколькими поставщиками: наличие утечки SqlException из уровня SqlDataAccess и SocketException из уровня NetworkDataAccess делает код вызова зависящим от подробных сведений Вашей реализации. Лучше переносить их в DataAccessException или что-то.
Я записал запись в блоге некоторое время назад о том, когда бросить различные типы исключений, и когда создать новые типы исключительной ситуации. Дело не в этом долго, но является, вероятно, слишком длинным для вставки здесь, так извините меня за то, что я просто связался. Это должно покрыть Ваш вопрос о том, почему существуют различные типы исключительной ситуации, и как знать, необходимо ли создать пользовательский.
Я думаю, что простой ответ, "Создают пользовательское исключение, когда никакое существующее исключение adequetely не выражает исключительной ситуации".
У меня также есть второе правило, что я подаю заявку: "Только создайте пользовательское исключение, если Вы ожидаете, что разработчик сможет обработать исключение". Нет никакого смысла в создании нового исключения, если Вы не считаете исключение восстанавливаемым условием. Это - больше effectient для броска InvalidOperationException в тот контекст.
Править: Законченная запись сообщения в блоге на этом предмете: http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx