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);
});