2016-04-27 53 views
2

使用rxJava 1.1.3時,在onCompleted處理中拋出異常時,不會調用onError,也不會將錯誤傳播到調用線程。它只是消失。如何避免在onCompleted中引發的異常被吞噬

作爲一個例子考慮以下斯波克測試:和

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 
} 

上述測試失敗,因爲onErrorCalledFromSubscribe永遠不會調用是在試驗結束時返回false。

現在,我可以想象一旦調用onCompletedonError不應該被調用,因爲應該調用其中一個或另一個。

但是,我不知道你是如何處理這樣的情況,在你的onCompleted方法中調用RuntimeException並且你想要處理這個錯誤。

您是否簡單地將onCompleted調用包裝在try-catch中並處理錯誤?

+1

這看起來像是一個RxJava本身的錯誤 - 完全吞嚥異常不應該發生。 –

+0

我看着它,我們確定它是一個錯誤:https://github.com/ReactiveX/RxJava/issues/3885。現在有一個公關可以在下一個版本的RxJava中修復它:https://github.com/ReactiveX/RxJava/pull/3886 –

回答

0

只要使用onCompleted中的try-catch,如果您認爲可能存在異常。

正如我在評論中提到的,RxJava不應該吞嚥來自onCompleted的例外,但目前是;如果你知道有是異常的可能性,你應該自己處理。

+0

好的,謝謝,我會嘗試捕獲異常並在那裏處理它。 –