2016-04-27 10 views
2

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?

+1

Dies scheint ein Fehler in RxJava selbst zu sein - das vollständige Verschlucken von Ausnahmen sollte nicht passieren. –

+0

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 –

Antwort

0

Verwenden Sie einfach einen Try-Catch in onCompleted, wenn Sie denken, dass dort eine Ausnahme geworfen werden könnte.

Wie ich in den Kommentaren erwähnte, sollte RxJava keine Ausnahmen von onCompleted schlucken, aber ist derzeit; Wenn Sie wissen, dass die Möglichkeit einer Ausnahme ist, sollten Sie nur selbst damit umgehen.

+0

ok danke, ich werde versuchen, die Ausnahme zu fangen und es dort zu behandeln. –

Verwandte Themen