为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

郎朗坤 2023-07-19 17:00:11
我的任务是使用 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非常感谢。
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

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


我应该在那里做的是:


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 我不应该将错误“包装”到引发的异常中,而是将它们包装到包含异常的错误响应中。


查看完整回答
反对 回复 2023-07-19
?
哔哔one

TA贡献1854条经验 获得超8个赞

处理此问题的一种方法是在测试中使用 try-catch 块,解开 CompositeException,然后断言捕获的异常。


fun testSummarizationException() {

    try {

        summarizeConfirmedTransactions()

    } catch (ex: Exception) {

        val customException = (ex as? CompositeException)?.exceptions?.get(0)

        //  assert to make sure thrown exception is of custom type

        assert(customException is SummarizationException)

    }

}

这是 CompositeException 被解包以获取自定义异常的地方。


val customException = (ex as?CompositeException)?.exceptions?.get(0)


如果允许,异常会被类型转换为 CompositeException。如果该类型不允许强制转换,则将返回 null 并导致测试失败。


查看完整回答
反对 回复 2023-07-19
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信