toBlocking()中的错误处理

时间:2017-03-14 12:39:22

标签: java rx-java reactive-programming

我正在使用RxJava将应用程序重构为反应范例。我正在一步一步地这样做,所以我需要在某些情况下使用toBlocking()来暂时尊重接口。使用toBlocking()时如何处理错误?

之前,我有这样的事情:

public List<Employee> getEmployees() {
    try {
        return repository.getEmployees();
    } catch(Exception e) {
        throw new MyCustomException();
    } 
}

现在,存储库有一个反应接口(返回Observable<List<Employee>>),所以我这样做:

public List<Employee> getEmployees() {
    return repository.getEmployees().toBlocking().single(); 
}

订阅repository.getEmployees()可能会返回错误Observable。我的问题是:我怎样才能处理这个阻止它阻塞的错误?

我找到了方法singleOrDefault(),但像singleOrThrow(new MyCustomException())之类的东西会很好。

3 个答案:

答案 0 :(得分:2)

你不能这样做,你需要用try / catch块包装它, toBlocking()Observable转换为BlockingObservable,这不是完全反应性的块,更像是花哨的集合,它现在缺乏组合Observable,运算符,控制线程/并行性和基本功能的能力async API的构造,内置了错误处理,(onError()

文档中有关BlockingObservable的说明:

  

它可用于测试和演示目的,但通常是这样   不适合生产应用程序(如果您认为需要   使用BlockingObservable这通常是你应该的标志   重新考虑你的设计)。

那么,阻止可观察的行为有什么意义呢?如果您无法将接口更改为Observable,那么您可能会错过使用Rx和Observable的所有要点,这是(理想情况下)抽象出系统中基于事件的每个操作,以及然后能够使用操作员/组合/异步管理的强大功能,并在您的系统中构建事件流 如果您只是使用Observable包装一些API操作然后将其返回到非反应世界,则API的使用者无法享受Rx的所有上述好处。
所以,我认为您应该重新考虑这样做的目的是什么,以及您的最终目标是什么,您可以考虑在系统中的几个地方替换Reactive方法以便开始。

答案 1 :(得分:2)

我们还有另一种方法来处理错误,方法是使用变体方法将错误处理为 onErrorReturn ...

=right column top cell < left column top cell

答案 2 :(得分:0)

Rx将MyCustomException封装在RuntimeException中,因此您应该捕获RuntimeException,然后调用getCuase()来获取MyCustomException,如下所示。

public List<Employee> getEmployees() {
    try {
        return repository.getEmployees().toBlocking().single(); 
    } catch (RuntimeException e) {
        MyCustomException myCustomException = e.getCause();
        if (e != null) {
            // caught MyCustomException
        }
    }
}