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

确认:Swift中do代码块内抛出错误是否会触发catch代码块?

关于Swift中throws函数内do-catch的行为确认

你的观察完全符合Swift的语法规则,这是预期行为。

do-catch结构的核心作用就是捕获其内部do代码块中抛出的所有错误——不管是通过try调用抛出函数产生的错误,还是直接用throw语句主动抛出的错误,只要在do块范围内抛出,都会被后续的catch块捕获处理。

回到你的代码:

func download() throws {
    do {
        // try throwingFunc()
        throw Constants.Errors.API.invalidResponse(statusCode: 2)
    } catch {
        print("unexpected")
        throw Constants.Errors.API.invalidData
    }
}

当do块里执行throw Constants.Errors.API.invalidResponse(statusCode: 2)时,这个错误会被立即捕获到紧跟的catch块中,所以会先打印unexpected,然后将invalidData错误重新抛出到download()函数外部。

如果想让do块里的错误直接抛到函数外部,有两种常见方式:

  • 去掉内部的do-catch结构:因为download()本身标记了throws,函数内抛出的错误会自动向外传播,无需额外处理
    func download() throws {
        // try throwingFunc()
        throw Constants.Errors.API.invalidResponse(statusCode: 2)
    }
    
  • 保留do-catch但只处理特定错误,其余错误重新抛出:
    func download() throws {
        do {
            throw Constants.Errors.API.invalidResponse(statusCode: 2)
        } catch let apiError as Constants.Errors.API where apiError == .invalidData {
            print("仅处理invalidData错误")
            // 这里可以添加自定义处理逻辑
        }
        // 非invalidData的错误会自动向外抛出
    }
    

内容的提问来源于stack exchange,提问作者Dany Jamous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:45:04