处理方法中发生的已知错误有哪些好方法?
我们以用户注册方法为例.当用户注册时,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)
这里最后一个是我最喜欢的那个,但我仍然不喜欢它.我不喜欢传递错误代码的想法.我不喜欢返回代码的想法,就此而言.
我喜欢使用自定义异常的想法,因为它似乎更清洁,但我不喜欢使用异常进行流控制.也许在这个例子的特定情况下,已经在系统中的电子邮件应该是一个例外,它没关系.
在这种情况下,其他人做了什么?
在这种情况下,我将创建一个用户定义的异常,并使用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)
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |