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

withCheckedThrowingContinuation能否使用自定义错误?编译报错求解决

关于withCheckedThrowingContinuation使用自定义错误的问题

问题情况

初始代码与编译错误

代码:

enum FooError : Error {}

class FooTest {
    func slowMethod() async throws {
        try await withCheckedThrowingContinuation { (c: CheckedContinuation<Void, FooError>) -> Void in
        }
    }
}

编译错误:

无法将类型 '(CheckedContinuation<Void, FooError>) -> Void' 转换为预期参数类型 '(CheckedContinuation<Void, any Error>) -> Void'。泛型参数 'E' 的实参 ('any Error' 和 'FooError') 必须匹配

疑问:withCheckedThrowingContinuation 是否可以接受自定义错误?

编辑补充后的代码与报错

修改后的代码:

enum FooError : Error {}

class FooTest {
    func slowMethod() async throws {
        try await withCheckedThrowingContinuation { (c: CheckedContinuation<Void, Error>) -> Void in
            c.resume(throwing: FooError)
        }
    }
}

报错信息:

参数类型 'FooError.Type' 不符合预期类型 'Error'

解决方法

withCheckedThrowingContinuation 完全支持自定义错误,问题出在使用方式上,分两种场景修正:

场景1:指定自定义错误作为Continuation的错误类型

如果希望Continuation仅抛出FooError,需要显式指定withCheckedThrowingContinuation的泛型参数,而非在闭包参数里声明类型:

enum FooError: Error {}

class FooTest {
    func slowMethod() async throws {
        try await withCheckedThrowingContinuation<Void, FooError> { continuation in
            // 抛出自定义错误
            continuation.resume(throwing: FooError())
            // 或者正常完成
            // continuation.resume()
        }
    }
}

若想让方法明确只抛出FooError,可给方法的throws添加类型限制:

func slowMethod() async throws(FooError) {
    try await withCheckedThrowingContinuation<Void, FooError> { continuation in
        continuation.resume(throwing: FooError())
    }
}

场景2:使用通用Error类型

如果沿用默认的any Error类型,需注意必须传递错误实例而非类型本身,补充代码的错误根源就是传递了FooError类型,改成实例即可:

enum FooError: Error {}

class FooTest {
    func slowMethod() async throws {
        try await withCheckedThrowingContinuation { (c: CheckedContinuation<Void, Error>) -> Void in
            c.resume(throwing: FooError()) // 创建FooError实例
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:15:23