处理方法中的已知错误和错误消息

时间:2010-10-13 16:59:34

标签: c# .net

处理方法中发生的已知错误有哪些好方法?

我们以用户注册方法为例。用户注册时,会调用方法SignUp( User user )。可能会发生一些已知的错误。

  • 电子邮件已注册
  • 用户名已注册

你可以抛出特定的例外:

public void SignUp( User user )
{
    // Email already exists
    throw new EmailExistsException();
}

现在可以捕获特定的例外情况。

我认为这是不好的,因为异常被用于流量控制。

您可以返回一个布尔值,表明它是否成功并传入一条错误消息,如果发生错误,该消息将被设置:

public bool SignUp( User user, out/ref string errorMessage )
{
    // Email already exists
    errorMessage = "Email already exists.";
    return false;
}

我出于某些原因不喜欢这个。

  • 必须返回一个值。如果该方法需要返回值,该怎么办?
  • 每次都必须传递错误信息。
  • 该方法的消费者应该是确定消息是什么的消费者。

让我们说一下方法中设置的实际消息是坏的。

您可以使用错误代码:

public enum Errors
{
    Successful = 0,
    EmailExists,
    UsernameExists,
    Etc
}

public Errors SignUp( User user )
{
    // Email already exists
    return Errors.EmailExists;
}

// or

public void SignUp( User user, out/ref Errors error )
{
    // Email already exists
    error = Errors.EmailExists;
}

这里最后一个是我最喜欢的那个,但我仍然不喜欢它。我不喜欢传递错误代码的想法。我不喜欢返回代码的想法,就此而言。

我喜欢使用自定义异常的想法,因为它似乎更清洁,但我不喜欢使用异常进行流控制。也许在这个例子的特定情况下,已经在系统中的电子邮件应该是一个例外,没关系。

在这种情况下,其他人做了什么?

2 个答案:

答案 0 :(得分:2)

在这种情况下,我将创建一个名为NewUserRegistrationException的用户定义异常,其中包含一个特殊属性(名为Reason),该属性将包含失败的原因

使用您的示例,枚举器

public enum RegistrationErrorType
{
    Successful = 0,
    EmailAlreadyExists,
    UsernameAlreadyExists,
    Etc
}

非常容易理解。

然后,想要通过调用您的方法注册新用户只能.ToString()异常以弹出一般错误,或者(在阅读文档之后)switch Reason属性并做出相应的反应(专注于电子邮件字段,颜色用红色密码等)。

示例代码:

public class NewUserRegistrationException : Exception
{
    public RegistrationErrorType Reason { get; private set; }
    public NewUserRegistrationException(RegistrationErrorType reason)
        : base()
    {
        Reason = reason;  
    }
    public NewUserRegistrationException(RegistrationErrorType reason, string message)
        : base(message)
    {
        Reason = reason;  //might as well create a custom message?
    }
    public NewUserRegistrationException(RegistrationErrorType reason, string message, Exception inner)
        : base(message, inner)
    {
        Reason = reason; //might as well create a custom message?
    }
}

答案 1 :(得分:0)

每当我开始考虑像这样的常见问题时,我要做的第一件事就是检查某人是否已经提出了一个很好的解决方案...所以当为“.net验证框架”执行谷歌搜索时很多好结果弹出......

最近我一直在使用TNValidate(http://tnvalidate.codeplex.com/