gpt4 book ai didi

java - 防止 RxJava 将我的自定义异常包装到复合异常中

转载 作者:行者123 更新时间:2023-11-30 05:29:28 38 4
gpt4 key购买 nike

我的任务是使用 RxJava 进行实现,并以这种方式进行保护,如果发生任何错误,它将被包装到自定义异常中。

问题是,无论我做什么,RxJavaPlugin 都会决定将我的异常包装到 CompositeException 中,即使只有一个异常。哪个测试失败。

我已经尝试了在谷歌上能找到的所有方法,直到实际覆盖 RxJavaPlugin 的全局错误处理程序,但它忽略了尝试的更改。

在撰写本文时应该抛出它的函数的实现

Single<BigDecimal> summarizeConfirmedTransactions() throws SummarizationException {
try{
Observable<Transaction> observableTransactions = transactions.get()
.doOnError(throwable -> {
Exceptions.propagate(throwable);
});
Observable<Confirmation> observableConfirmations = confirmations.get()
.doOnError(throwable -> {
Exceptions.propagate(throwable);
});
return Observable.zip(observableTransactions, observableConfirmations, (t, c) -> new ConfirmableTransaction(t.transactionId, c.isConfirmed, t.value))
.filter(confirmableTransaction -> confirmableTransaction.isConfirmed)
.map(t -> t.value)
.reduce(BigDecimal::add)
.toSingle()
.doOnError(throwable -> {
Exceptions.propagate(throwable);
});
}catch(Exception e)
{
throw new SummarizationException(e.getMessage());
}

测试中的断言失败,因为最终抛出的异常是 CompositeException,其中包含单个异常。我需要让它成为 SummarizationException.class

提前非常感谢。

编辑:根据要求,这里是用于测试解决方案的代码。我无权修改此内容。

    @Test
public void shouldWrapErrorIntoException() {
final ConfirmedTransactionSummarizer summarizer =
new ConfirmedTransactionSummarizer(ALL_CONFIRMED::transactions, () -> Observable.error(new RuntimeException("Booom")));


summarizer
.summarizeConfirmedTransactions()
.subscribe(testObserver);

testObserver.assertError(SummarizationException.class);
testObserver.assertErrorMessage("Booom");
}
PS。我问过任务的提供者,他说“我是唯一一个遇到这样问题的人”,我不应该让事情变得过于复杂并寻求最简单的解决方案......这会导致 3 个异常的复合异常 - 一个其中是我的异常包装,另外两个是测试代码插入的 RuntimeException 实例。

最佳答案

好的,经过更多的挖掘,并在 friend 的帮助下,我成功地确定了任务的意图:

我应该在那里做的是:

Single<BigDecimal> summarizeConfirmedTransactions() throws SummarizationException {
Observable<Transaction> observableTransactions = transactions.get();
Observable<Confirmation> observableConfirmations = confirmations.get();

return Observable.zip(observableTransactions, observableConfirmations,
(t, c) -> new ConfirmableTransaction(c.isConfirmed, t.value))
.filter(confirmableTransaction -> confirmableTransaction.isConfirmed)
.map(t -> t.value)
.reduce(BigDecimal::add)
.toSingle()
.onErrorResumeNext(th -> Single.error(new SummarizationException(th.getMessage())));
}

TL:DR 我不应该将错误“包装”到引发的异常中,而是将它们包装到包含异常的错误响应中。

关于java - 防止 RxJava 将我的自定义异常包装到复合异常中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57875237/

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