这不是真正的问题,我只是好奇。
例如,我正在为 API 创建操作,最好使用:
public bool Login(string username, string password);
并在登录失败时返回false 。
或者我应该使用:
public void Login(string username, string password);
并返回一些我的异常,比如 LoginFailedException?
什么更好,为什么?
当意外发生时,您应该提出一个Exception
。
在您的情况下,如果用户正在登录,则程序失败并不意外,他/她可能输入了错误的密码或使用了错误的用户名密码组合。
例如,如果找不到数据库,那将是例外。
异常不应用作流程控制结构,而应用于处理可能在应用程序正常流程之外发生的那些边缘、意外情况。
确保返回正确的响应,在 JSON 中它可能类似于
{
"result": "failure",
"message": "username and/or password not matching to any user"
}
因为一个简单的错误根本没有信息。
我认为最好的方法是使用异常来捕获登录的所有异常行为,但返回 true 或 false 以了解登录是否成功。
一个方法应该使用一个返回值来指示它由于立即调用代码的原因而失败将能够有效地处理,或者如果由于立即调用代码无法有效处理的原因而失败,则抛出异常。如果方法的作者不知道调用者是否能够处理失败,那么提供一个版本可能会有所帮助,该版本会在出现任何问题时抛出,并且会使用返回值来指示是否已发生任何预期的故障情况。尝试登录远程机器是可能适用任何一种情况的场景。如果调用代码准备在放弃之前尝试例如三种不同的登录方法,那么第一次尝试通过返回代码报告失败可能比他们抛出异常更有帮助。但是,如果代码期望登录到远程机器并与之交互,
请注意,即使想要使用返回值来指示某事是否成功,abool
也可能不是最佳选择。为此目的定义一个类或接口类型可能会更有帮助,其中一个成员指示某事是否有效,其他方法可能会提供任何失败的详细信息。通常应该避免让方法不必要地分配对象,但是如果有一个静态“成功”实例,如果一切正常,该方法可以返回该实例,则可以避免在常见情况下进行这种分配。调用代码可能如下所示:
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);
如果任何登录尝试成功,该方法将返回。如果所有三个尝试都失败,则会抛出一个异常,其中包含一个封装列表,指示每次尝试报告的问题。成功的 ATryLogin
可以简单地返回对从其字段为 and 派生的类的静态实例的引用LoginResult
,succeeded
并且final
如果true
所有三个尝试都失败,则调用代码只需创建一个新的列表对象。