代码之家  ›  专栏  ›  技术社区  ›  Egor Pavlikhin

错误消息与引发异常C ASP.NET

  •  4
  • Egor Pavlikhin  · 技术社区  · 16 年前

    在许多情况下,在Web应用程序中,您需要返回错误消息,而不是简单的真/假结果。有人会使用例外,但我认为例外是一种表示,你知道,例外行为。让我们以一个类用户的register()函数为例。如果成功了,我们可以简单地返回true,但是如果发生了错误,我们想知道确切的内容:“密码不匹配”、“电子邮件格式无效”等等(可能是错误代码而不是消息,没关系)。

    问题是,在C和.NET中返回此类错误消息的最佳实践是什么?可能有一个结构就绪,比如:

    public struct Result {
        public bool OK;
        public string Message;
    }
    

    或者我应该在函数中使用一个参数?LIKE寄存器(输出字符串消息)。

    更新。这几乎描述了我所需要的一切: http://blogs.msdn.com/kcwalina/archive/2005/03/16/396787.aspx

    4 回复  |  直到 15 年前
        1
  •  3
  •   Darin Dimitrov    16 年前

    如果是为了验证,我会推荐你 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;
    
        2
  •  2
  •   user151323    16 年前

    我认为这里可以也应该使用例外。

    您可以将register()调用放入try/catch块中,从而阻止应用程序执行停止。在catch块中,您将分析到底出了什么问题,并返回适当的消息。

        3
  •  2
  •   Jeroen van Langen    15 年前

    我认为在程序错误和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);
    

    等。。。

    因此,如果抛出异常,这意味着3件事中的1件。

    • 某些输入(由用户)未经验证。(程序员的疏忽)

    • 里面有虫子。(例如访问已处理的对象或严重的问题)。等)

    • IO有问题。(从数据库连接丢失..等)

    我建议你只在特殊情况下使用例外。错误的登录也不例外,这是用户的错误。

    当做, 耶罗恩

        4
  •  0
  •   Emrah GOZCU    16 年前

    抛出异常会在添加所有调用堆栈和设置异常类的其他字段时创建CPU利用率。

    我不喜欢抛出异常。如果真的是偶然的错误,比如说参数为空,那么我将使用带有exceptionmessage字段的结构。

    但最好在调用方法之前键入值检查,并期望从方法返回基元类型,因为需要返回布尔值。

    推荐文章