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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:26:59