Swift 2中的异步错误处理

6

我尝试在Swift 2中处理错误。但我不确定的一件事是如何使其适用于异步回调函数。假设我正在从后端加载资源。我定义了以下错误类型:

enum NetworkError: ErrorType {
    case NoConnection
    case InvalidJSON
    case NoSuccessCode(code: Int)
}

我计划在出现问题时抛出这些案例之一。以下是进行网络调用的函数:

func loadRequest<T: Decodable>(request: NSURLRequest, callback:T -> Void) throws {
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request) { data, response, error in
        // Other code that parses json and at somewhere it throws
        throw NetworkError.NoConnection
    }
}

但是编译器报错:

无法通过类型为 (NSURLRequest, (_,_,_) throws) -> Void 的参数列表调用 dataTaskWithRequest

由此可以看出,当使用 throws 声明同一闭包类型时,它被认为是不同的类型。

那么在这些情况下,这种 do-try-catch 怎么工作呢?

2个回答

3

异步无法抛出错误,因为当错误发生时,函数已经返回。你需要在闭包内通过调用带有ErrorType参数的某个函数来处理错误,以决定如何处理错误。例如:

import Foundation

enum NetworkError: ErrorType {
    case NoConnection
    case InvalidJSON
    case NoSuccessCode(code: Int)
}


func getTask() -> NSURLSessionDataTask? {
    let session = NSURLSession.sharedSession()
    let urlRequest = NSURLRequest(URL: NSURL(string: "www.google.com")!)
    return session.dataTaskWithRequest(urlRequest) { data, response, error in
        if let error = error {
            asyncError(error)
        } else {
            // Do your stuff while calling asyncError when an error occurs
        }
    }
}

func asyncError(error: ErrorType) {
    switch error {
    case NetworkError.NoConnection:
        // Do something
        break
    default:
        break
    }
}

0

NSURLSession.h 中似乎没有抛出异常的内容。因此,我想知道这个类是否已经转换为使用这个新功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接