确认: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
相关产品推荐
相关产品推荐

