我正在使用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())
之类的东西会很好。
答案 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
}
}
}