2017-02-28 105 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