Это правильный способ использовать исключения? - PullRequest
2 голосов
/ 24 января 2011

У меня есть исключение членства, которое выглядит следующим образом:

public enum MembershipError
{
    EmailNotFound,
    EmailNotConfirmed,
    IncorrectPassword,
    EmailExists
}

public class MembershipException : ApplicationException
{
    public MembershipError MembershipError { get; set; }

    public MembershipException(MembershipError membershipError)
        : base(Enum.GetName(typeof (MembershipError), membershipError))
    {
        MembershipError = membershipError;
    }
}

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

try
{

}
catch (MembershipException exception)
{
    switch (exception.MembershipError)
    {
        case MembershipError.EmailExists:

            break;
            //etc.
    }
}

Мой сервисный уровень выдает эти исключения, веб-слой / в действии перехватывает их, генерирует правильный json и возвращает его в представление,Предложить альтернативу, пожалуйста?

Ответы [ 5 ]

5 голосов
/ 24 января 2011

Исключения следует использовать только для исключительных ситуаций.Ошибки, перечисленные в вашем перечислении, кажутся достаточно стандартными, и я бы предпочел не выражать их через исключение.Вместо этого я бы предпочел стиль API TryXXX исключениям.

Например

public bool TryGetMembershipData(
  string user, 
  out Data data, 
  out MemberShipError error) {
  ...
}
3 голосов
/ 24 января 2011

Похоже, вы используете обработку исключений для проверки данных. Это плохой дизайн для начала. Вы должны выполнить эти проверки по отдельности, прежде чем проходить окончательную регистрацию.

1 голос
/ 24 января 2011

Плохая идея. Исключения обычно следует использовать только в «исключительных» случаях. У вас также будут проблемы с производительностью.

0 голосов
/ 24 января 2011

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

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

0 голосов
/ 24 января 2011

Может показаться, что это не очень хорошо для ПК, но я считаю, что разработка программного обеспечения - это не религия, которая заставляла бы вас соблюдать строгие правила только ради этого.Есть, конечно, теоретические объяснения для Дос и Донс , есть тонны Считается вредными эссе, , но всегда ли они применимы к вашим собственнымcase ?

Давайте просто прагматично:

  1. Ваш класс MembershipException достаточно специализирован, и, что самое главное, его легко поддерживать с помощью MembershipError enum.

  2. Кроме того, стоимость обработки исключений часто завышена: ваш уровень обслуживания участников в конце концов не является симулятором полета в реальном времени;сбой при входе в систему время от времени не ставит ваше приложение на колени.

Просто держите его так: просто поддерживать и легко читать.

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