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

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

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

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

你可以抛出特定的例外:

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

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

这在我看来是不好的,因为exception被用于流量控制。

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

 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; } 

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

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

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

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

使用您的示例,枚举器

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

很容易理解。

谁想通过调用你的方法注册一个新用户只需.ToString()弹出一般错误的exception,或(在阅读完文档后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? } } 

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

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