使用ApplicationException

时间:2015-09-29 21:46:14

标签: c# asp.net asp.net-mvc design-patterns

我想知道当用户违反某些业务规则时,是否建议使用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"); 
}

这是一个好的或坏的策略?如果不是,那会是更好的方法吗?

3 个答案:

答案 0 :(得分:8)

在您的代码示例中,最好抛出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
    }

答案 1 :(得分:5)

来自https://msdn.microsoft.com/en-us/library/System.ApplicationException

  

您应该从Exception类而不是ApplicationException类派生自定义异常。您不应该在代码中抛出ApplicationException异常,除非您打算重新抛出原始异常,否则不应捕获ApplicationException异常。

一个简单的原因是.NET中有其他异常类派生自ApplicationException。如果您在代码中抛出ApplicationException并在以后捕获它,您可能还会捕获可能会破坏您的应用程序的派生异常。

答案 2 :(得分:2)

您实际应该使用Exception通过派生来创建应用程序中的自定义异常。虽然你也应该阅读这个answer

对于您特定的示例案例参数验证,如果它不存在则应该抛出ArgumentException,那么您可以为此创建一个从Exception类派生的自定义类。