我有一个非常简单的问题,但我只能在C ++线程中找到类似的答案。编译器在getUserFromServer
函数上抱怨说它需要return
值,即使它可以捕获异常。很明显为什么要求返回值,但我不确定如何正确处理这种情况。
一种方法是创建某种虚拟user
并返回它,但听起来不是很好。另一种方法是通过返回类型Optional
,但它只是将nil-checks的责任转移到另一个级别,这可能不是一个好主意。任何帮助都会有所帮助。
这是一个模拟我在实际代码中期望的行为的设置。
enum TestError: Error {
case JustError
}
class User {}
class ServerClient {
func getUser(really: Bool) throws -> User {
var uza: User?
if really {
uza = User()
}
guard let user = uza else {
throw TestError.JustError
}
return user
}
}
func getUserFromServer() -> User {
let client = ServerClient()
let user: User
do {
user = try client.getUser(really: true)
return user
} catch TestError.JustError {
print("just an error occured")
} catch {
print("something terrible happened")
}
} //Error: missing return in a function
答案 0 :(得分:6)
所以想象一下我是调用者,我写了这行代码:
let user = getUserFromServer()
print(user)
它以某种方式失败了。大。你想要发生什么? user
应该是什么?应该打印什么? (这里没有正确的答案;问题实际上是你希望它是什么?)
如果您希望user
为零,则getUserFromServer
应返回User?
。如果您希望user
成为某个默认用户,那么您需要一种方法来创建它。如果您希望调用者根本不打印(而是处理一些错误),那么getUserFromServer()
应该抛出。如果您希望崩溃,则需要在fatalError
内添加getUserFromServer
。这些都是有效的,但它必须做某事,以及那是什么,取决于你。
那就是说,如果问题只是关于它应该是什么的建议,看看这个代码你应该默认使它成为一个可选项,除非你需要一些其他的行为。这是“正常”的事情,因为你已经“处理”了这个错误。