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

