Использование ApplicationException

Я хотел бы знать, рекомендуется ли использовать ApplicationException для возврата ошибок приложения, когда пользователь нарушает какое-либо бизнес-правило. Например:

public void validate(string name, string email)
{   
    int count1 = (from p in context.clients
        where (p.name == clients.name)
        select p).Count();

    if (count1 > 0)
        throw new ApplicationException("Your name already exist in the database");

    int count2 = (from p in context.clients
        where (p.email == clients.email)
        select p).Count();

    if (count2 > 0)
        throw new ApplicationException("Your e-mail already exist in the database"); 
}

Это хорошая или плохая стратегия? Если это не так, то какой будет лучший подход?

Ответ 1

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

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

 public void update(string name, string email)
    {
        if (string.IsNullOrEmpty(name))
        {
            throw new ArgumentNullException(nameof(name), "Type your name");
        }

        if (string.IsNullOrEmpty(email))
        {
            throw new ArgumentNullException(nameof(email), "Type your e-mail");
        }

        if (isValidEmail(email))
        {
            throw new ArgumentException(nameof(name), "Invalid e-mail");
        }

        //Save in the database
    }

Ответ 2

Из https://msdn.microsoft.com/en-us/library/System.ApplicationException:

Вы должны получать пользовательские исключения из класса Exception, а не класса ApplicationException. Вы не должны бросать исключение ApplicationException в свой код, и вы не должны улавливать исключение ApplicationException, если не собираетесь повторно выбрасывать исходное исключение.

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

Ответ 3

На самом деле вы должны использовать Exception для создания пользовательского исключения в вашем приложении, производного от него. Хотя вы должны также прочитать этот ответ.

Для вашего конкретного примера проверки аргументов аргумента case следует выдать ArgumentException если он не существовал, тогда вы могли бы создать собственный класс, производный от класса Exception для этого.