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

How to handle exceptions in a nice way?

我正在尝试编写一个简单的控制台应用程序,我的用户 class 看起来像这样:

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; }
}

我的目标是为每个 属性 从用户那里获得一个输入,但我想检查用户输入是否 符合特定标准。例如:当用户尝试为名称 属性 输入值时,我想检查输入的值是否以大写字母开头、包含数字、是否少于五十个字符等,如果输入的值无效,然后我抛出异常并要求用户重试,如果有效,则我们继续下一个 属性 等等。

我的问题是我不知道如何简化这个过程,因为如果我有一个 属性 必须满足一百个标准会怎样。

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

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

以下代码运行所有验证标准,即使任何一个失败并在最后输出管道分隔字符串中的所有错误消息。 如果至少有一个条件失败,函数将 return 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, bool>>, string> dict1 = 
                new Dictionary<Expression<Func<User, bool>>, 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);