PromiseKit 6.0如何将捕获的错误传递给调用方?
解决PromiseKit 6.x中错误传递的问题
我刚巧也处理过类似的PromiseKit版本迁移问题,对你的处境感同身受!从4.x升级到6.x后,catch的行为变化确实会打乱原来的错误传递逻辑,不过我们可以用recover方法完美替代原来的需求。
核心思路:用recover替代catch传递错误
PromiseKit 6.x中,catch被设计为链式调用的终止器——它会捕获错误但不会将错误继续传递下去;而recover的作用正好是捕获错误后返回一个新的Promise,这和你原来在PK4中用catch返回Promise的逻辑完全匹配。
具体代码改造示例
假设你原来的PK4代码大概是这样的:
func loginAndSync(withServerAddress address: String, port: String) -> Promise<()> { synchronizationService.stopAllRunningSingleSynchronizations() return authorizationService.saveServerAddress(address, port: port) .then { _ in synchronizationService.startFullSynchronization() } .catch { error in // 原来的错误处理逻辑,比如日志、清理 print("Login & Sync failed: \(error.localizedDescription)") // 返回失败的Promise,将错误传递给调用方 return Promise(error: error) } }
现在迁移到PK6.x,只需要把catch替换成recover,并在闭包中处理后重新抛出错误(或返回失败的Promise):
func loginAndSync(withServerAddress address: String, port: String) -> Promise<()> { synchronizationService.stopAllRunningSingleSynchronizations() return authorizationService.saveServerAddress(address, port: port) .then { _ in synchronizationService.startFullSynchronization() } .recover { error in // 保留你原来的错误处理逻辑 print("Login & Sync failed: \(error.localizedDescription)") // 方式1:直接抛出原错误,传递给调用方 throw error // 方式2:如果需要包装错误,返回一个失败的Promise // return Promise<()>(error: CustomSyncError.wrapped(error)) } }
为什么这样可行?
recover会捕获上游链中的错误,允许你执行自定义处理逻辑(比如日志、资源清理)- 当你在
recover中抛出错误或返回失败的Promise时,这个错误会继续向下传递,最终被调用方的catch捕获 - 如果在
recover中返回成功的Promise,整个链式调用会恢复为成功状态(这也是recover名字的由来)
额外提示
如果你的场景只是需要让错误传递到调用方,不需要中间处理,那甚至可以直接去掉原来的catch,让错误自然流到调用方的catch块中。但如果需要保留中间错误处理逻辑,recover就是最适合的替代方案。
内容的提问来源于stack exchange,提问作者Kamil Harasimowicz
相关产品推荐
相关产品推荐

