You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:06:10