将异常抛出 RxJava 范围之外

问题描述 投票:0回答:1

“它不是重复的”理由

StackOverlow 告诉我,我需要编辑我的问题并解释为什么提议的重复项(及其相应的接近投票)不相关:

  • 第一个“RxJava 中如何返回值”绝对不是关于异常的。感觉就像某人不理解 RxJava,并且觉得有权链接一个随机的 RxJava 问题并将我的问题标记为“重复”。感谢您为让 StackOverflow 变得有毒作出贡献。
  • 第二个“rxjava throws OnErrorNotImplementedException”实际上是相关的,但不是重复的:它没有回答我的问题,但不可否认,它在提到的意义上看起来很相似
    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

rx-java
1个回答
0
投票

一种方法是致电

.blockingAwait()
:

如果源发出错误信号,则操作员会将已检查的异常包装到 RuntimeException 中并抛出该异常。否则,运行时异常和错误将按原样重新抛出。

使用 Kotlin 和协程,RxJava 可以使用

suspendCoroutine
suspendCancellableCoroutine
转换为协程,如下所示:

suspendCancellableCoroutine { cont ->
    val disposable = someCompletable
        .subscribe({ cont.resume(Unit) }, { e -> cont.resumeWithException(e) })
    cont.invokeOnCancellation { disposable.dispose() }
}
© www.soinside.com 2019 - 2024. All rights reserved.