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
你想传播给您的用户)。
假设我有一些 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
你想传播给您的用户)。