2017-02-28 107 views
1

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

在普通的Java,这是非常简单的:

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

如果我们把它变成可观察到,这将会是不明确的。

Observable<Student> findStudentsByGrade(int grade) { 

} 

回答

0

使用chec ked异常可能允许您传达“一种方法具有这种确定类型的错误条件”的消息,但它确实与命令式同步编程相关。

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

在这样的反应流,一切都发生异步(如数据变为可用,穿越Flux)和没有发生,直到有一个subscribe(...)(可在执行多后完成)。所以概念上,一切都变成了运行时异常。

即使你的方法是基于Flux/Observable并返回一个Flux/Observable,它可能只是描述了预期的输出行为,通过增加更多的运营商,但实际上并没有处理任何数据是不是真的从哪里发生错误。

您仍然可以当然让这样的方法扔东西就像一个NullPointerException(或相关检查除外),如果你想验证参数或信号问题完全防止Flux/Observable被创建,但不是数据相关错误(因为执行将在稍后发生)。

这种信息将需要进入您反应式API的文档/ javadoc中(并且我们推荐使用RuntimeException的子类而不是任何您想要传播给用户的检查Exception)。

+0

更新我的回复。这意味着,没有Javadoc注释肯定。用户必须仔细阅读该流可能抛出的内容。我对吗? – sancho21

+0

即使异常不是checked-and-thr-throws-clause,你也可以使用'@ throws' javadoc标签。 http://docs.oracle。COM/JavaSE的/ 8 /文档/技术说明/工具/窗/ javadoc.html#CHDCHAHD –

0

如果管道内的异常情况,那么你的用户将获得抛出的onerror的回调

@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

+0

嗨保罗。我正在研究如何向其他开发人员说明流可能会抛出某些异常。我想,除了正确阅读文档之外别无其他办法,因为方法签名不会有帮助。 – sancho21

+0

你可以在你的管道上设置错误操作符,那么很明显你想控制一个可能的可抛出 – paul

+0

抱歉。我仍然不明白你,请给我一个例子吗? – sancho21