处理方法中的已知错误和错误消息
处理方法中发生的已知错误有哪些好方法?
我们以用户注册方法为例。 用户注册时,会调用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/ )