可用的 doOnError{} 没有解决由于 subscribe() 中缺少 onError 处理程序而未处理异常

发布于 2025-01-10 14:10:34 字数 3229 浏览 2 评论 0原文

我有一个 PublishSubject:

subjectA = PublishSubject.create() ,

然后其操作类似于:

  subjectA 
    .flatMap {
        //..
    }
    .flatMapUntil({ it }) {
        //..
    }
    .observeOn(AndroidSchedulers.mainThread())
    .filter { it.isFilter }
    .doOnNext {
        //..
    }
    .doOnError { e->
        Log.d("TAG", "doOnError ${e.localizedMessage}")
    }
    .takeUntil(disposeComposable)
    .subscribe()

认为上面的代码创建了以下日志输出:

RX 全局错误 io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException:由于缺少 onError 处理程序,未处理异常 subscribe() 方法调用。进一步阅读: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | java.util.NoSuchElementException:集合不包含元素 匹配谓词。 在 io.reactivex.rxjava3.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:718) 在 io.reactivex.rxjava3.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:715) 在io.reactivex.rxjava3.internal.observers.LambdaObserver.onError(LambdaObserver.java:77) 在io.reactivex.rxjava3.internal.util.AtomicThrowable.tryTerminateConsumer(AtomicThrowable.java:110) 在 io.reactivex.rxjava3.internal.util.HalfSerializer.onError(HalfSerializer.java:118) 在 io.reactivex.rxjava3.internal.operators.observable.ObservableTakeUntil$TakeUntilMainObserver.onError(ObservableTakeUntil.java:85) 在 io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onError(ObservableDoOnEach.java:117) 在 io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:97) 在 io.reactivex.rxjava3.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52) 在 io.reactivex.rxjava3.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:202) 在 io.reactivex.rxjava3.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:256) 在 io.reactivex.rxjava3.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:123) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7839) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 引起原因:java.util.NoSuchElementException:集合不包含与谓词匹配的元素。 在 com.example.app.DataModel.initialize$lambda-31(data.model.kt:571) 在 com.example.app.DataModel.$r8$lambda$9iWq6yMOxbhDAuxg-6-Wk1ZnNzk(未知 来源:0) 在 com.example.app.DataModel$$ExternalSyntheticLambda11.accept(未知 来源:4) 在 io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:93)

错误消息显示,我没有实现 onError() 方法调用:由于缺少 onError,未处理异常subscribe() 方法调用中的处理程序。

但我显然添加了一个 doOnError{}。此外,上述代码中的 localizedMessage 告诉我们:

集合不包含与谓词匹配的元素。

这里出了什么问题?

I have a PublishSubject:

subjectA = PublishSubject.create()

whoch is then operated similar to:

  subjectA 
    .flatMap {
        //..
    }
    .flatMapUntil({ it }) {
        //..
    }
    .observeOn(AndroidSchedulers.mainThread())
    .filter { it.isFilter }
    .doOnNext {
        //..
    }
    .doOnError { e->
        Log.d("TAG", "doOnError ${e.localizedMessage}")
    }
    .takeUntil(disposeComposable)
    .subscribe()

Thinking that above code created following log output:

RX global error
io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the
subscribe() method call. Further reading:
https://github.com/ReactiveX/RxJava/wiki/Error-Handling |
java.util.NoSuchElementException: Collection contains no element
matching the predicate.
at io.reactivex.rxjava3.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:718)
at io.reactivex.rxjava3.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:715)
at io.reactivex.rxjava3.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
at io.reactivex.rxjava3.internal.util.AtomicThrowable.tryTerminateConsumer(AtomicThrowable.java:110)
at io.reactivex.rxjava3.internal.util.HalfSerializer.onError(HalfSerializer.java:118)
at io.reactivex.rxjava3.internal.operators.observable.ObservableTakeUntil$TakeUntilMainObserver.onError(ObservableTakeUntil.java:85)
at io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onError(ObservableDoOnEach.java:117)
at io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:97)
at io.reactivex.rxjava3.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52)
at io.reactivex.rxjava3.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:202)
at io.reactivex.rxjava3.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:256)
at io.reactivex.rxjava3.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:123)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.util.NoSuchElementException: Collection contains no element matching the predicate.
at com.example.app.DataModel.initialize$lambda-31(data.model.kt:571)
at com.example.app.DataModel.$r8$lambda$9iWq6yMOxbhDAuxg-6-Wk1ZnNzk(Unknown
Source:0)
at com.example.app.DataModel$$ExternalSyntheticLambda11.accept(Unknown
Source:4)
at io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:93)

Error message says, I do not have implemented an onError() method call: The exception was not handled due to missing onError handler in the subscribe() method call.

But I obviously added a doOnError{}. Further the localizedMessage on the above code tells:

Collection contains no element matching the predicate.

Wha is wrong here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一个人的旅程 2025-01-17 14:10:34

正如错误消息所示,subscribe 方法中没有错误处理程序:

.doOnError { e->
    Log.d("TAG", "doOnError ${e.localizedMessage}")
}
.takeUntil(disposeComposable)
.subscribe() // <------------------------------------------------

doOnError 是一种不同的方法,不是错误处理程序,仅查看链中的错误。

因此,您必须将处理程序放在正确的位置:

.doOnError { e->
    Log.d("TAG", "doOnError ${e.localizedMessage}")
}
.takeUntil(disposeComposable)
.subscribe(
   { value -> Log.d("TAG", "onNext ${value}") },
   { e -> Log.d("TAG", "onError ${e.localizedMessage}") }
)

集合不包含与谓词匹配的元素。

检查这里发生了什么:

at com.example.app.DataModel.initialize$lambda-31(data.model.kt:571)

As the error message indicates, you don't have an error handler in the subscribe method:

.doOnError { e->
    Log.d("TAG", "doOnError ${e.localizedMessage}")
}
.takeUntil(disposeComposable)
.subscribe() // <------------------------------------------------

doOnError is a different method and is not an error handler, only a peek into an error in the chain.

Consequently, you'll have to put a handler the right place:

.doOnError { e->
    Log.d("TAG", "doOnError ${e.localizedMessage}")
}
.takeUntil(disposeComposable)
.subscribe(
   { value -> Log.d("TAG", "onNext ${value}") },
   { e -> Log.d("TAG", "onError ${e.localizedMessage}") }
)

Collection contains no element matching the predicate.

Check what happens here:

at com.example.app.DataModel.initialize$lambda-31(data.model.kt:571)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文