Mit rxJava 1.1.3 wird beim Auslösen einer Ausnahme in der onCompleted
-Handhabung weder der onError
aufgerufen noch der Fehler an den aufrufenden Thread weitergegeben. Es verschwindet einfach.So vermeiden Sie Ausnahmen, die bei onCompleted eingeschleust werden
Als Beispiel den folgenden spock Test berücksichtigen:
def "when a onCompleted throws an IllegalStateException, it's handled by the onError handler"() {
given:
boolean onErrorCalledFromSubscribe = false
when:
Observable.just(1, 2, 3)
.subscribe(
Actions.empty(),
{ onErrorCalledFromSubscribe = true},
{throw new IllegalStateException("I'm behaving badly")})
then:
noExceptionThrown()
onErrorCalledFromSubscribe == true
}
Der obige Test fehlschlägt, weil onErrorCalledFromSubscribe nie und ist am Ende des Tests falsch genannt wird.
Nun kann ich mir vorstellen, dass einmal onCompleted
aufgerufen wird, onError
sollte nicht aufgerufen werden, weil entweder der eine oder der andere aufgerufen werden sollte.
Allerdings frage ich mich, wie Sie mit solchen Situationen umgehen, in denen eine RuntimeException
in Ihrer onCompleted
Methode aufgerufen wird und Sie den Fehler behandeln möchten.
Sie wickeln einfach den onCompleted
Aufruf in einen try-catch und behandeln den Fehler dort?
Dies scheint ein Fehler in RxJava selbst zu sein - das vollständige Verschlucken von Ausnahmen sollte nicht passieren. –
Ich schaute hinein und wir stellten fest, dass es ein Fehler war: https://github.com/ReactiveX/RxJava/issues/3885. Es gibt jetzt eine PR, um es in der nächsten Version von RxJava zu beheben: https://github.com/ReactiveX/RxJava/pull/3886 –