错误消息与抛出异常C#ASP.Net

时间:2009-09-25 09:56:59

标签: c# error-handling reporting exception

在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

4 个答案:

答案 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。

但最好在调用方法之前进行类型值检查,并期望从方法返回原始类型,因为需要返回布尔值。