返回抛出函数的值

ino*_*key 4 swift

我有一个非常简单的问题,但我只能在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
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 6

所以想象一下我是调用者,我写了这行代码:

let user = getUserFromServer()
print(user)
Run Code Online (Sandbox Code Playgroud)

它以某种方式失败了.大.你想要发生什么?应该user是什么?应该打印什么?(这里没有正确的答案;问题真的是想要的是什么?)

如果你想user成为零,那么getUserFromServer应该回来User?.如果你想user成为一个默认用户,那么你需要一种方法来创建它.如果你想让调用者根本不打印(而是处理一些错误),那么getUserFromServer()应该抛出.如果你想让它崩溃,那么你需要添加一个fatalError内部getUserFromServer.这些都是有效的,但它必须做某事,而那些东西,取决于你.

也就是说,如果问题只是关于它应该是什么的建议,那么看看这段代码你应该默认使它成为一个可选项,除非你需要一些其他的行为.因为你已经"处理"了错误,所以这将是"正常"的事情.