Catch' 块无法访问,但我包含了 try

Alb*_*ert 3 swift swiftui

我收到以下错误:

'catch' block is unreachable because no errors are thrown in 'do' block
Run Code Online (Sandbox Code Playgroud)

但是我的尝试存在,那么我如何包含错误?

AF.request(url).responseData(completionHandler: { data in
    do {
        if let apiJsonData = try? JSONDecoder().decode(MyModel.self, from: data.data!){
            self.items = apiJsonData.data.items
        }
    } catch {
        print("Decoding failed -> ERROR:", error)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我将它包含在标题中,例如:data, error in它会引发错误:

Contextual closure type '(AFDataResponse<Data>) -> Void' (aka '(DataResponse<Data, AFError>) -> ()') expects 1 argument, but 2 were used in closure body
Run Code Online (Sandbox Code Playgroud)

如何正确设置 try catch?

Swe*_*per 6

你用过try?,没有try

try?将整个表达式转换为nilif 抛出错误。它已经自行处理了错误,因此catch块不再需要捕获错误。另一方面,try不这样做。有关更多信息,请参阅Swift 指南的错误处理部分。

如果您希望catch块捕获错误,则应使用try,并删除if块。

AF.request(url).responseData(completionHandler: { data in
    do {
        let apiJsonData = try JSONDecoder().decode(MyModel.self, from: data.data!)
        self.items = apiJsonData.data.items
    } catch {
        print("Decoding failed -> ERROR:", error)
    }
}
Run Code Online (Sandbox Code Playgroud)

另请注意,您在data.data这里假设不为零。如果网络请求失败,情况可能并非如此。最好检查一下:

AF.request(url).responseData(completionHandler: { data in
    do {
        guard let data = data.data else {
            print("Response Error:", data.error)
            return
        }
        let apiJsonData = try JSONDecoder().decode(MyModel.self, from: data.data!)
        self.items = apiJsonData.data.items
    } catch {
        print("Decoding failed -> ERROR:", error)
    }
}
Run Code Online (Sandbox Code Playgroud)