【问题标题】:Swift 2.0: throw exception within an asynchronous piece of codeSwift 2.0:在异步代码中抛出异常
【发布时间】:2015-11-22 04:37:35
【问题描述】:

我正在尝试为应用程序实现登录服务,如果响应状态码不等于 200,我想抛出异常。我正在使用 Alamofire 作为 HTTP 网络库。

static func loginWithUsername(username: String, andPassword password: String) throws {

    let action = "SmartShoppers/login"
    let url = baseUrl + action


    Alamofire.request(.POST, url, parameters: ["username": username, "password": password])
        .response { request, response, data, error in
            if response?.statusCode != 200 {
                throw ServiceError.LogInError
            }
    }
}

这是 ServiceError 枚举定义:

enum ServiceError: ErrorType {
    case LogInError
}

当它被抛出在按下按钮时调用的函数中时,我想要处理这个异常。此函数位于与包含该按钮的 ViewController 关联的 ViewController 类中。将要执行的代码是:

do {
    try Service.loginWithUsername(username, andPassword: password)
} catch {
    // SHOW AN ALERT MESSAGE
}

为什么我会收到消息Cannot call value of non-function type 'NSHTTPURLResponse'?这是实现此服务的正确方法吗?如果没有,请帮助我。

【问题讨论】:

    标签: asynchronous swift2 alamofire


    【解决方案1】:

    您传递给response 方法的闭包在其签名中不包含throws,因此您将无法在其中引发异常。

    IMO 无论如何,这不是您想要抛出异常的情况 - 非 200 响应代码不是异常错误/失败,我不会尝试在这里使用异常作为控制手段流。

    【讨论】:

    • 如何在签名中包含throws?我必须输入 Alamofire 代码吗?
    • 这就是你要开始的地方,是的——例如如果您使用的是 v1.3.1,您会在此处找到您的 response 函数定义 -> github.com/Alamofire/Alamofire/blob/1.3.1/Source/… -- 但同样,我建议您不要走这条路
    • 你不能这样扔。我会在这里遵循@fqdn 的建议。如果您想确切了解为什么不能以这种方式抛出,我建议您尝试在操场上完成一个示例,在该示例中,您使用完成处理程序创建一个异步登录方法并尝试使其以异步方式抛出。它不起作用。这正是我们在 Alamofire 中使用 Result 类型的原因。
    • 我也想抛出异常。如果响应不同于 200。我的任务是用其他方法管理此异常
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多