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

Swift 6:Task内使用Typed Throws遇类型推断错误求助

问题原因

Swift 5.9引入的Typed Throws(带类型的抛出)虽能让异步函数明确声明抛出的错误类型,但在Task闭包的catch块中,编译器暂时无法自动推断捕获到的error就是你声明的MyError类型——它会把error视为底层的_ErrorCodeProtocol协议类型,自然找不到.one成员。

解决办法

有几种简单方式可以修复这个问题:

方法1:显式类型转换

在catch块里先把error转换成MyError类型,再进行匹配:

func anotherTest() {
    Task {
        do {
            try await test()
        } catch let myError as MyError {
            switch myError {
            case .one:
                print("one")
            }
        } catch {
            // 处理其他可能的错误(如果有的话)
            print("其他错误:\(error)")
        }
    }
}

方法2:直接在catch中匹配错误类型

利用Swift的模式匹配,直接在catch分句里指定MyError.one,无需额外switch:

func anotherTest() {
    Task {
        do {
            try await test()
        } catch MyError.one {
            print("one")
        } catch {
            // 处理其他错误
            print("其他错误:\(error)")
        }
    }
}

方法3:在switch中添加类型判断

如果一定要用switch,可以在case里先明确类型:

func anotherTest() {
    Task {
        do {
            try await test()
        } catch {
            switch error {
            case let err as MyError where err == .one:
                print("one")
            default:
                print("其他错误:\(error)")
            }
        }
    }
}
补充说明

非异步代码能正常运行,是因为同步函数的throws(MyError)在catch时,编译器能直接推断错误类型;但Task属于独立的异步任务上下文,当前Swift编译器的类型推断还未覆盖这个场景,因此需要手动明确类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:12:06