在Web应用程序的许多情况下,您需要返回错误消息,而不是简单的true / false结果。人们可以使用例外,但我认为例外表明了特殊行为。我们为一个类User采用Register()函数。如果它成功了,我们可以简单地返回true,但如果出现问题,我们想知道究竟是什么:“密码不匹配”,“电子邮件格式无效”等等(可能是错误代码而不是一条消息,没关系)。
问题是在C#和.Net中返回此类错误消息的最佳做法是什么?可能有一个结构就绪,例如:
public struct Result {
public bool OK;
public string Message;
}
或许我应该在函数中使用参数?喜欢注册(输出字符串消息)。
更新。这几乎描述了我需要的一切:http://blogs.msdn.com/kcwalina/archive/2005/03/16/396787.aspx
答案 0 :(得分:3)
如果是出于验证目的,我会向您推荐优秀的Fluent Validation库。
来自网站的引用:
using FluentValidation;
public class CustomerValidator: AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Company).NotNull();
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
}
}
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;
答案 1 :(得分:2)
我认为可以而且应该在这里使用例外。
您可以将Register()调用放在try / catch块中,从而阻止应用程序执行停止。在catch块中,您将分析确切的错误并返回相应的消息。
答案 2 :(得分:2)
我认为在程序错误和IO通信方面应该使用异常。 这意味着:
未经验证的输入
软件中的错误。 (在词典中添加2个相同的键)
磁盘访问/网络/跨应用程序/等
对于Register方法,我应该使用布尔值进行结果检查。
if(Register("someone", "password"))
{
// success
}
else
{
// failed
}
或者如果您想了解有关结果的更多详细信息,请指定结果枚举:
public enum RegisterResult
{
Success,
BadUsernamePassword,
PasswordTooShort
}
RegisterResult result = Register("someone", "password");
switch(result)
{
case(RegisterResult.Success):
// success
break;
case(RegisterResult.BadUsernamePassword):
// failed
break;
case(RegisterResult.PasswordTooShort):
// failed
break;
}
如果您需要更多信息,例如userId,则应将其定义为输出参数
int userId = 0;
RegisterResult result = Register("someone", "password", out userId);
等...
因此,如果抛出异常,这意味着三件事中的一件。
某些输入(按用户)未经过验证。 '(程序员的疏忽)
它有错误。 (比如访问被处置的物品或严重的东西等)
存在IO问题。 (连接丢失的数据库..等)
我建议你只在特殊情况下使用例外。错误的登录也不例外,这是用户错误。
此致 的Jeroen
答案 3 :(得分:0)
抛出异常会在添加所有调用堆栈和设置异常类的其他字段时创建CPU利用率。
我不想抛出异常。如果它真的是偶然的错误,比如说Argument为null,我会选择带有ExceptionMessage字段的struct。
但最好在调用方法之前进行类型值检查,并期望从方法返回原始类型,因为需要返回布尔值。