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

Swift 6 typed-throws的catch穷尽性编译器矛盾问题求解

解决Swift 6 Typed Throws的Catch穷尽性矛盾问题

针对Swift 6(Xcode 16)中使用typed throws(SE-0413)时遇到的编译器矛盾问题,目前有两种可行的解决方式:

方法一:通过Switch语句处理类型化错误

将所有错误case放在switch中处理,配合类型转换的catch clause,编译器能正确识别错误处理的穷尽性,无需额外兜底catch:

func foo() async {
    do {
        try await funcWithTypedThrow()
    } catch let error as MyError {
        switch error {
        case .one:
            print("one")
        case .two:
            print("two")
        }
    }
}

这种写法符合SE-0413的设计预期,编译器不会抛出“未穷尽”错误,也不会产生冗余警告。

方法二:临时添加私有属性抑制警告(不推荐)

如果要保留多个独立catch clause的写法,可以给兜底catch添加私有属性@_disfavoredOverload来抑制“永远不会被执行”的警告,但这仅作为临时 workaround:

func bar() async {
    do {
        try await funcWithTypedThrow()
    } catch .one {
        print("one")
    } catch .two {
        print("two")
    } catch {
        @_disfavoredOverload
        print("this is required to silence 'non-exhaustive' error")
    }
}

注意:该私有属性可能在未来Swift版本中失效,不建议长期使用。

补充说明

这个矛盾本质是Xcode 16 beta版本的编译器bug——根据SE-0413的设计,当函数明确声明throws(MyError)时,编译器应该能识别针对MyError所有case的catch是穷尽的。后续正式版Xcode大概率会修复这个问题,届时直接使用多个独立catch clause即可正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:26:04