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

Jos*_*ose 6 .net c#

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

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

  • 该邮箱地址已被注册
  • 用户名已被注册
  • 等等

你可以抛出特定的例外:

public void SignUp( User user )
{
    // Email already exists
    throw new EmailExistsException();
}
Run Code Online (Sandbox Code Playgroud)

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

这在我看来是不好的,因为异常被用于流量控制.

你可以返回一个布尔声明,如果它成功并传入一个错误消息,如果发生错误将被设置:

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

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

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

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

您可以使用错误代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ale*_*ini 2

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

使用您的示例,枚举器

public enum RegistrationErrorType
{
    Successful = 0,
    EmailAlreadyExists,
    UsernameAlreadyExists,
    Etc
}
Run Code Online (Sandbox Code Playgroud)

是很容易理解的。

然后想要通过调用您的方法来注册新用户的人可以只是.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?
    }
}
Run Code Online (Sandbox Code Playgroud)