StackOverlow 告诉我,我需要编辑我的问题并解释为什么提议的重复项(及其相应的接近投票)不相关:
OnErrorNotImplementedException
。我正在使用一个公开 RxJava2 API 的库。但我的代码没有使用 RxJava(它实际上是 Kotlin)。所以我希望能够从 RxJava 向“外部世界”抛出异常,以便我的代码可以捕获它。
所以我想做这样的事情:
fun myFun() {
someCompletable
.doOnError { throw it }
.subscribe()
}
并且让
myFun()
的用户根本不了解RxJava。问题是,当 RxJava 抛出异常时,它会被包裹在 OnErrorNotImplementedException
中,而我不希望这样:
io.reactivex.exceptions.OnErrorNotImplementedException:由于 subscribe() 方法调用中缺少 onError 处理程序,因此未处理异常。进一步阅读:https://github.com/ReactiveX/RxJava/wiki/Error-Handling | [这是实际的异常]
有没有办法让
myFun()
抛出实际的异常而不是 OnErrorNotImplementedException
?
一种方法是致电
.blockingAwait()
:
如果源发出错误信号,则操作员会将已检查的异常包装到 RuntimeException 中并抛出该异常。否则,运行时异常和错误将按原样重新抛出。
使用 Kotlin 和协程,RxJava 可以使用
suspendCoroutine
或 suspendCancellableCoroutine
转换为协程,如下所示:
suspendCancellableCoroutine { cont ->
val disposable = someCompletable
.subscribe({ cont.resume(Unit) }, { e -> cont.resumeWithException(e) })
cont.invokeOnCancellation { disposable.dispose() }
}