如何以一种很好的方式处理异常?

问题描述

我正在尝试编写一个简单的控制台应用程序,其中有一个如下所示的User类:

class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Id { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

我的目标是从用户那里获取每个属性的输入,但是我想检查用户输入是否 符合特定标准。例如:当用户尝试为Name属性输入值时,我想检查输入的值是否以大写字母开头,包含数字,少于五十个字符等,以及输入的值是否不是有效,然后抛出异常并要求用户重试,如果有效,则移至下一个属性,依此类推。

我的问题是我无法弄清楚如何简化此过程,因为如果我的财产必须满足一百个条件,会发生什么情况。

有没有一种简单的方法来检查用户输入是否满足很多条件,如果不满足,我抛出异常,显示随机错误消息,然后用户可以重试。

解决方法

一种非常简单的方法是为任何给定的类创建ValidationCriterias字典和相应的错误消息。由于进行了用户输入验证检查,因此我只会抛出一条有效的友好错误消息,而不是抛出异常,因为这种错误已经预料到了。

即使有任何一个失败,下面的代码也会运行所有验证条件,并最终以管道分隔的字符串输出所有错误消息。 如果至少有一个条件失败,则该函数将返回false。

   public class User
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int Id { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
    }

    public class ValidateProps<T> where T: class
    {
        public static bool RunRules(Dictionary<Expression<Func<T,bool>>,string> lst,T myObj,out string errorMessages)
        {
            errorMessages = "";
            bool isSuccess = true;
            foreach (var l in lst)
            {
                if (l.Key.Compile()(myObj) == false) isSuccess = false;
                errorMessages += l.Key.Compile()(myObj) == true ? "" : "|" +l.Value;
                
            }
            errorMessages = errorMessages.Trim('|');
            return isSuccess;
        }
    }

    // Example Usage
    User u = new User() { Name = "dd23dd",Age = 100 };
    Dictionary<Expression<Func<User,string> dict1 = 
                new Dictionary<Expression<Func<User,string>()
                    { {x => Char.IsUpper(x.Name.ToCharArray().ElementAt(0)),"Error Message 1" },{x => !(x.Name.Any(char.IsDigit)),"Error Message 2"},};

     string errorMsgs = "";
     bool n1 = ValidateProps<User>.RunRules(dict1,u,out errorMsgs);