RxJava或Reactor上的异常声明

时间:2017-02-28 04:04:08

标签: rx-java project-reactor

假设我有一些返回Observable的API。如何告诉API客户端/用户API可能会抛出某些异常?

在普通的Java中,它非常简单:

List<Student> findStudentsByGrade(int grade) 
  throws NegativeGradeException, DataRetrievalFailureException {
}

如果我们将其更改为Observable,则不清楚。

Observable<Student> findStudentsByGrade(int grade) {

}

2 个答案:

答案 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的子类你的用户)。