如何以一种好的方式处理异常?
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);
我正在尝试编写一个简单的控制台应用程序,我的用户 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);