RxJava 或 Reactor 上的异常声明

Exception declaration on RxJava or Reactor

假设我有一些 API 可以 returns 观察到。如何告诉 API clients/users API 可能会抛出某些异常?

通俗地说Java,很简单:

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

如果改成Observable就不清楚了

Observable<Student> findStudentsByGrade(int grade) {

}

如果管道内发生异常,那么您的订阅者将在 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

使用检查异常可能会让您传达 "a method has this identified type of error condition" 的信息,但它实际上与命令式同步编程相关。

在响应式编程中,错误通过 onError 信号向下传播到异步数据流中,因为所述错误可能发生在流上游的任何地方(包括其他线程和程序的其他部分)。

在这样的反应流中,一切都是异步发生的(随着数据变得可用并遍历 Flux)并且 subscribe(...) 之前什么都不会发生(这可以在执行的后期完成)。所以从概念上讲,一切都或多或少成为运行时异常。

即使您的方法适用于 Flux/Observable 和 returns a Flux/Observable,它也可能只描述了预期的输出行为通过向其添加更多运算符,但实际上并不处理任何数据,也不是真正会发生错误的站点。

如果您想验证完全阻止 Flux/Observable 将被创建,但不会出现与数据相关的错误(因为执行将在稍后发生)。

这类信息将需要进入你的反应 API 的 documentation/javadoc (我们建议使用 RuntimeException 的子类而不是任何检查 Exception 你想传播给您的用户)。