'Try'中包含了一个无法被捕获的'catch'块

3
我遇到了以下错误:
'catch' block is unreachable because no errors are thrown in 'do' block

但是我的尝试已经存在了,我如何将错误包含在其中呢?

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)
    }
}

如果我像这样在头部包含它:data, error in,就会抛出错误:
Contextual closure type '(AFDataResponse<Data>) -> Void' (aka '(DataResponse<Data, AFError>) -> ()') expects 1 argument, but 2 were used in closure body

如何正确设置 try catch 块?

1个回答

6

你使用了 try?,而不是 try

try? 如果产生错误就将整个表达式变成nil。它已经单独处理了错误,所以没有更多的错误可以被 catch 块捕获。另一方面,try 不会这样做。更多信息请参见 Swift 指南的 Error handling 部分。

如果您想让 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)
    }
}

还要注意,您假定 data.data 此处不为 nil。如果网络请求失败,情况可能并非如此。最好检查一下:

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)
    }
}

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