这不是真正的问题,我只是好奇。
例如,我正在为API创建操作,最好使用:
public bool Login(string username, string password);
登录失败时返回 false 或者我应该使用:
public void Login(string username, string password);
并返回一些我的异常,比如LoginFailedException?
什么更好,为什么?
答案 0 :(得分:3)
如果发生意外情况,你应该提出Exception
。
在您的情况下,如果用户登录并不意外,该过程失败,他/她可能插入了错误的密码或使用了错误的用户名密码组合。
例如,如果找不到数据库,那将是例外。
异常不应该用作流控制结构,而应该用于处理可能在应用程序正常流程之外发生的边缘意外情况。
请确保返回正确的响应,在JSON中它可能类似于
{
"result": "failure",
"message": "username and/or password not matching to any user"
}
因为简单的错误根本没有提供信息。
答案 1 :(得分:1)
我认为最好的方法是使用异常来捕获登录的所有异常行为,但返回true或false以了解登录是否成功。
答案 2 :(得分:0)
一个方法应该使用一个返回值来指示它失败的原因是立即调用代码能够有效地处理,或者如果因为立即调用代码而失败则抛出异常无法有效处理。如果方法的作者不知道调用者是否能够处理失败,那么它可能有助于提供一个版本,该版本将在出现任何问题时抛出,并且将使用返回值来指示是否任何预期的故障情况都已发生。尝试登录远程计算机的情况可能适用于任何一种情况。如果准备呼叫代码,例如在放弃之前尝试三种不同的登录方法,对于第一次尝试通过返回代码报告失败而不是抛出异常可能更有帮助。但是,如果代码期望登录到远程计算机并与之交互,则登录尝试失败可能表示整个交互式序列失败,在这种情况下,登录方法可能更有帮助一个异常,而不是要求调用者检查登录方法的返回代码,并在失败时抛出自己的异常。
请注意,即使想要使用返回值来指示某些内容是否成功,bool
可能不是最佳选择。为此目的定义类或接口类型可能更有帮助,其中包含指示某些内容是否有效的成员,以及可提供任何失败详细信息的其他方法。通常应该避免让方法不必要地分配对象,但是如果有一个静态的“成功”实例,如果一切正常,该方法可以返回,则可以避免在常见情况下进行这样的分配。调用代码可能如下所示:
result1 = TryLogin(first batch of info/parameters);
if (result1sSucceeded)
return;
result2 = TryLogin(second batch of info/parameters);
if (result2.succeeded)
return;
result3 = TryLogin(third batch of info/parameters);
if (result3.succeeded)
return;
results = new ArrayList<LoginResult>;
results.add(result1);
results.add(result2);
results.add(result3);
throw new RepeatedLoginFailureException(results);
如果任何登录尝试成功,该方法将返回。如果所有三次尝试都失败,将抛出一个异常,其中包含一个封装列表,指示每次尝试报告的问题。成功的TryLogin
可能只返回对LoginResult
字段为succeeded
字段为final
和true
的{{1}}派生的类的静态实例的引用,以及调用如果所有三次尝试都失败,代码只需要创建一个新的列表对象。