2017-09-06 50 views
0

與操作訂閱時如何處理異常下面是一個簡單的例子:在RXJava

Completable c = Completable.create(new CompletableOnSubscribe() { 
    @Override 
    public void subscribe(@NonNull CompletableEmitter e) throws Exception { 
     throw new Exception("Oh No!"); 
    } 
}); 

try { 
    c.subscribe(new Action() { 
     @Override 
     public void run() throws Exception { 
      Timber.v("It's ok"); 
     } 
    }); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
    Timber.v("Error"); 
} 

在這種情況下,我會預計將捕捉到的異常但它會導致應用程序崩潰。那麼我們應該如何處理由內部類方法拋出的異常呢?

我知道我們可以通過訂閱CompletableObserver來處理這個問題,但它增加了我想避免的額外冗長度,我覺得必須有一種方法來處理這種異常,其他操作消費者也不會這樣做,非常有用。

+0

有一個[重載](http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html#subscribe-io.reactivex.functions.Action-io.reactivex.functions。消費者 - )接受錯誤的消費者,您可以處理異常。此外,試圖捕捉這樣的反應性組件不起作用,因爲它們表示錯誤而不是(重新)拋出它們。 – akarnokd

+0

你能否提供一個例子,我發現很難想象你的意思。 –

回答

1

首先已經有一個機制來捕獲異常,但你需要實現onError行動。

看看下面的代碼:

Completable c = Completable.create(new CompletableOnSubscribe() { 
    @Override 
    public void subscribe(@NonNull CompletableEmitter e) throws Exception { 
     throw new Exception("Oh No!"); 
    } 
}) 

c.subscribe(new Action() { 
    @Override 
    public void run() throws Exception { 
     Timber.v("It's ok"); 
    } 
}, new Consumer<Throwable>() { // Second argument is onError Action 
    @Override 
    public void accept(Throwable e) { 
     // Handle you exception here. 
     Timber.v("Error"); 
    } 
}); 

讓我們來爲什麼你的代碼是無法趕上,即使你已經把在的try-catch一切異常,因爲異常被拋出是RuntimeException類的實例和你正在趕上Exception類的實例。 嘗試使用RuntimeException,引發異常應該被捕獲。

但是,它不是捕捉異常的理想方法,而是使用onError在上述代碼段中描述的操作。如果你的代碼拋出運行時異常,然後使用內部Observables中的try-catch將它轉換爲Exception

希望它有幫助。

0

沒有爲處理錯誤的重載:

所有RxJava的
c.subscribe(new Action() { 
    @Override 
    public void run() throws Exception { 
     Timber.v("It's ok"); 
    } 
}, new Consumer<Throwable>() { 
    @Override 
    public void accept(Throwable e) { 
     e.printStackTrace(); 
     Timber.v("Error"); 
    } 
});