c# – 最佳实践返回值vs异常与枚举

我试图找出具有多个结果值的方法的优点和缺点.

例如我正在使用登录方法.如果登录成功,它将通过,否则我需要知道为什么它失败.

1.返回true或false(没有足够的信息)

bool Login(string user,string password);

2.返回true,如果成功,否则抛出异常

public class UnkNownUserException : Exception { }
public class WrongPasswordException : Exception { }
bool Login(string user,string password);

没有回报抛出异常,如果不成功

public class UnkNownUserException : Exception { }
public class WrongPasswordException : Exception { }
void Login(string user,string password);

4.返回一个枚举值

enum LoginResult
{
    Successful
    UnkNownUser,WrongPassword
}
LoginResult Login(string user,string password);

登录”只是一个例子.我想知道不同实现的优点和缺点是什么,在哪种情况下,它们或多或少是适当的.

解决方法

你会得到更多的有意见的答案,如果我在做,我会结合3& 4.用一个枚举来抛出LoginFailedException为什么.
void Login(string user,string password);//Or return a bool(redundant though)

class LoginFailedException : ApplicationException
{
    public LoginFailReason Reason {get; private set;}
    public LoginFailedException(LoginFailReason reason)
    {
       this.Reason = reason;
    }
}

enum LoginFailReason
{
    UnkNownUser,WrongPassword
}

选择异常选项的原因:
假设您选择仅返回值方法,您的api(可能是客户端或其他开发人员)的用户可以有机会忽略该API.

instance.Login(user,password);
var accountInfo = instance.GetAccountInfo();//Assuming logged in; going to explode

谁知道他们必须这样做

if(instance.Login(user,password) == LoginResult.Successful))
{
    var accountInfo = instance.GetAccountInfo();
}

所以,IMO抛出异常表示我无法处理你的登录请求由于这样的原因.使简单

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...