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

