如何在RXJava中使用Actions订阅时处理异常

时间:2017-09-06 09:21:58

标签: java exception-handling rx-java reactive-programming

这是一个简单的例子:

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来解决这个问题,但这会增加我想要避免的额外冗长,我觉得必须有办法处理这种异常,而不是动作消费者不会非常有用。

2 个答案:

答案 0 :(得分:3)

首先,RxJava已经有了捕获异常的机制,但是你需要实现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操作。如果您的代码抛出Runtime异常,则使用Observables中的try-catch将其转换为Exception

希望它有所帮助。

答案 1 :(得分:0)

处理错误有一个重载:

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");
    }
});