假设我有一些返回Observable的API。如何告诉API客户端/用户API可能会抛出某些异常?
在普通的Java中,它非常简单:
List<Student> findStudentsByGrade(int grade)
throws NegativeGradeException, DataRetrievalFailureException {
}
如果我们将其更改为Observable,则不清楚。
Observable<Student> findStudentsByGrade(int grade) {
}
答案 0 :(得分:0)
如果管道内发生异常,那么您的订户将在onError回调中接收throwable
@Test
public void observableOnErrorResumeException() {
Integer[] numbers = {0, 1, 2, 3, 4, 5};
Observable.from(numbers)
.doOnNext(number -> {
if (number > 3) {
try {
throw new IllegalArgumentException();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
})
.doOnError(t-> System.out.println("Exception happens "+t.getMessage()))
.subscribe(n -> System.out.println("onNext:"+n),e -> System.out.println("onRrror:"+e.getMessage()),System.out::println);
}
此测试将打印
onNext:0
onNext:1
onNext:2
onNext:3
onRrror:java.lang.IllegalArgumentException
如果您想查看更多示例,请查看https://github.com/politrons/reactive
答案 1 :(得分:0)
使用已检查的异常可能允许您传达消息&#34;方法具有此类识别类型的错误条件&#34;,但它实际上与命令式同步编程相关联。
在反应式编程中,错误通过onError
信号沿着异步数据流向下传播,因为所述错误可能发生在流的任何地方(包括其他线程和程序的其他部分)。
在这样的反应流中,一切都是异步发生的(数据变得可用并遍历Flux
)而没有任何事情发生,直到有subscribe(...)
(可以这样做)很久以后的执行)。因此,从概念上讲,一切都或多或少成为运行时异常。
即使您的方法适用于Flux
/ Observable
并返回Flux
/ Observable
,它可能只会通过向其添加更多运算符来描述预期的输出行为,但实际上并没有处理任何数据,也不是真正发生错误的网站。
如果你想验证完全阻止NullPointerException
/ {{1的参数或信号问题,你当然可以让这样的方法抛出像Flux
(或相关的已检查异常)之类的东西。要创建,而不是与数据相关的错误(因为执行将在以后发生)。
这类信息需要进入您的被动API的文档/ javadoc(我们建议您使用Observable
的子类,而不是要传播到的任何已检查RuntimeException
的子类你的用户)。