在RxJava中对订阅抛出异常

时间:2017-11-19 20:53:10

标签: java rx-java2

请考虑以下代码:

  public static void main(String[] args) {
    try {
        observableTesting();
    } catch (Exception ex) {
        System.out.println("Exception propagated : " + ex.getLocalizedMessage());
    }
}


private static void observableTesting() throws Exception{
    Observable.fromCallable(() -> { throw new Exception("TEST"); })
            .subscribe(
                    next -> {},
                    error ->
                    {
                        System.out.println("Error : " + error.getLocalizedMessage());
                        throw new Exception(error);
                    }

            );}

我希望这会抛出异常并将其传播到调用函数。这似乎没有产生理想的效果。

作为一种解决方法,我目前必须分配错误并将其抛出函数的末尾。

有没有更好的方法将可观察的错误转换为异常?

2 个答案:

答案 0 :(得分:0)

您所看到的行为是预期的行为。请参阅有关错误处理的documentation

  

Observable通常不会抛出异常。相反,它会通知   任何观察者通过终止发生了不可恢复的错误   具有onError通知的Observable序列。

     

这有一些例外。例如,如果onError()调用   本身失败,Observable将不会尝试通知观察者   通过再次调用onError但会抛出RuntimeException,一个   OnErrorFailedException或OnErrorNotImplementedException。

为此,重新抛出异常正是你应该做的,以获得你期望的结果。

答案 1 :(得分:0)

好像你正在使用rxjava-2。在此版本下,所有未处理Throwable的specification for errors状态将通过系统上安装的Thread.UncaughtExceptionHandler或通过RxJavaPlugins.setErrorHandler()安装的错误处理程序传递。如果您正在尝试测试是否有可观察的投掷,您可以使用TestObserver代替:

Observable
     .fromCallable(() -> { throw new Exception("TEST"); })
     .test()
     .assertSubscribed()
     .assertError(Exception.class);