gpt4 book ai didi

java - 如何将异常从内部 doOnError 传播到外部 doOnError?

转载 作者:行者123 更新时间:2023-12-02 10:01:00 25 4
gpt4 key购买 nike

我有pay方法,我应该在其中调用initiatePayment,并且onSuccess我应该调用confirmPayment。如果两个调用中的任何一个出现异常,它应该发出异常

public Single<PayResponse> pay(PayRequest apiRequest) {

return client.initiatePayment(apiRequest)
.doOnSuccess(initiatePaymentResponse -> {
client.confirmPayment(initiatePaymentResponse.getPaymentId())
.doOnSuccess(confirmPaymentResponse -> doConfirmationLogic(confirmPaymentResponse ))
.doOnError(ex -> {ex.printStackTrace();logError(ex);});
})

.doOnError(ex -> {ex.printStackTrace();logError(ex);});
}

在我引用的代码中,confirmPayment 中发生错误,但 initiatePayment 继续正常运行。

如何将异常从内部 doOnError 传播到外部 doOnError

最佳答案

doOnXxx() 方法仅用于回调目的,它们不涉及流管道,这就是它们被称为“副作用方法”的原因。因此无法将错误从 doOnXxx() 传播到上游。

错误始终是 Rx 世界中的终端事件,只要发生错误,管道就会被取消,因此无需对 doOnSuccess() 方法执行某些操作来确保到目前为止一切都“正常”。因此,您可以简单地这样编写,而不是将代码嵌套到 doOnSuccess() 链中:

/*
you can deal with errors using these operators:

onErrorComplete
onErrorResumeNext
onErrorReturn
onErrorReturnItem
onExceptionResumeNext
retry
retryUntil
retryWhen
*/
return client.initiatePayment(apiRequest)
//if in initiatePayment was error this will send cancel upstream and error downstream
.map(initiatePaymentResponse -> { client.confirmPayment(initiatePaymentResponse.getPaymentId());})
//if in confirmPayment was error this never happens
.map(confirmPaymentResponse -> doConfirmationLogic(confirmPaymentResponse))
//every error in this pipeline will trigger this one here
.doOnError(ex -> {
ex.printStackTrace();
logError(ex);
});

关于java - 如何将异常从内部 doOnError 传播到外部 doOnError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55631087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com