Swift 5 do块无错误抛出引发catch块不可达警告如何解决
警告根因
graphQL 方法中 do 代码块内仅调用了 onSuccess(data),而你定义的 onSuccess 闭包类型为 @escaping (Foundation.Data) -> (),没有标记 throws,运行时不会抛出任何错误,所以 catch 块永远不会被执行,编译器才会抛出不可达警告。
解决方案(均不改动 getTimeDeposits 原有逻辑)
方案1:删除无用的 do-catch 块(最推荐)
既然 do-catch 没有实际作用,直接移除即可,同时可以优化原有逻辑的边界处理:
URLSession.shared.dataTask(with: request) { (data, response, error) in // 出现网络错误直接回调失败并返回,避免后续逻辑执行 if let error = error { onFailure(error) return } if let data = data { onSuccess(data) } }.resume()
该方案完全不影响你现有 getTimeDeposits 里的所有实现,改动最小,可直接消除警告。
方案2:保留 do-catch 结构,适配后续可抛出错误的场景
如果你后续计划让 onSuccess 闭包支持抛出错误被统一捕获,只需要修改 graphQL 方法的 onSuccess 参数声明,标记为可抛出:
// 只需要把 onSuccess 的类型加个 throws 标记 func graphQL(body: [String:Any], onSuccess: @escaping (Foundation.Data) throws -> (), onFailure: @escaping (Error) -> ())
修改后原有 do-catch 块就会被判定为可达,警告自动消失,且现有 getTimeDeposits 里的 onSuccess 闭包本身没有抛出操作,完全兼容新的参数类型,原有逻辑不会有任何变动。
额外提示:你当前
getTimeDeposits中解码使用的是try?,解码失败只会返回 nil,不会抛出错误,就算采用方案2也不会触发catch回调,符合你的需求。
内容的提问来源于stack exchange,提问作者akitainu22
相关产品推荐
相关产品推荐

