true
如果您不false
失败,那绝对没有理由成功。客户代码应该是什么样?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
在这种情况下,调用者仍然需要一个try-catch块,但是他可以更好地编写:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
因此,true
返回值与调用者完全无关。因此,只需保留该方法即可void
。
通常,有三种设计故障模式的方法。
- 返回true / false
- 使用
void
,引发(检查)异常
- 返回中间结果对象。
返回 true
/false
在一些较旧的,大多数为c样式的API中使用。不利的一面是,您不知道出了什么问题。PHP经常这样做,导致这样的代码:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
在多线程上下文中,这甚至更糟。
引发(检查)异常
这是一个很好的方法。在某些时候,您会期望失败。Java通过套接字来实现。基本假设是调用应该成功,但是每个人都知道某些操作可能会失败。套接字连接在其中。因此,调用者被迫处理失败。这是一个不错的设计,因为它可以确保调用方实际处理了故障,并为调用方提供了一种处理故障的优雅方法。
返回结果对象
这是处理此问题的另一种好方法。它通常用于解析或仅用于需要验证的事物。
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
调用者的逻辑也很好。
何时使用第二种情况以及何时使用第三种情况尚有争议。有些人认为例外应该是例外,并且您在设计时不应考虑例外的可能性,并且几乎总是使用第三个选项。没事。但是我们已经检查了Java中的异常,因此我认为没有理由不使用它们。当基本假设是调用应该成功(例如使用套接字)时,我会使用检查后的expetions ,但是可能会失败,并且当调用应该调用(例如验证数据)是否很不清楚时,我会使用第三个选项。但是对此有不同的意见。
就您而言,我会选择void
+ Exception
。您期望文件上传成功,如果成功,那就例外了。但是,调用方被迫处理该故障模式,并且您可以返回一个异常,该异常正确地描述了发生了哪种错误。