如何在SyncOnSubscribe RxJava中处理generateState中的错误?

时间:2016-01-25 20:08:54

标签: java reactive-programming rx-java backpressure

我正试图解决创建SyncOnSubscribe的问题,如果在状态初始化期间generateState方法失败,我不知道该怎么做。

return Observable.create(new SyncOnSubscribe<MyState, String>() {
    @Override
    protected MyState generateState() {
        return new MyState();   // <---- what if this fails?
    }

    @Override
    protected MyState next(MyState state, Observer<? super String> observer) {
        // do something with state
    }
});

我可以想到几种可以随意处理的方法:

  1. 如果抛出运行时异常,库会自动执行 致电o.onError? (见编辑)。
  2. 我可以将MyState包装在另一个存储错误的变量中,我可以在第一次调用o.onError时自己调用next
  3. 我只是好奇是否有建议的做法?

    谢谢!

    编辑:我尝试在generateState方法中抛出一个运行时异常,我认为它指向MyState包装我将在next方法中检查的错误。如果你有更好的建议,请评论/回答。

    public static Observable<String> getEventsOnSubscribe1() {
        return Observable.create((s) -> {
            throw new UnsupportedOperationException("getEvents3");
        });
    };
    
    /** Like 'getEventsOnSubscribe1' but wrap exception and call onError manually.  */
    public static Observable<String> getEventsOnSubscribe2() {
        return Observable.create((s) -> {
            try {
                throw new UnsupportedOperationException("getEvents3");
            } catch (Exception ex) {
                s.onError(ex);
            }
        });
    };
    
    public static Observable<String> getEventsSyncOnSubscribe() {
        return Observable.create(new SyncOnSubscribe<Channel, String>() {
            @Override
            protected Channel generateState() {
                System.out.println("SyncOnSubscribe.generateState");
                throw new UnsupportedOperationException("Not supported yet.");
            }
    
            @Override
            protected Channel next(Channel state, Observer<? super String> observer) {
                System.out.println("SyncOnSubscribe.next");
                throw new UnsupportedOperationException("Not supported yet.");
            }
    
            @Override
            protected void onUnsubscribe(Channel state) {
                System.out.println("SyncOnSubscribe.onUnsubscribe");
                throw new UnsupportedOperationException("Not supported yet.");
            }
        });
    }
    
    public static void main(String[] args) throws IOException, TimeoutException {
        getEventsOnSubscribe1()
        //getEventsOnSubscribe2()
        //getEventsOnSyncSubscribe()
                .toBlocking()
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("onCompleted");
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        System.out.println("onError: " + e.getLocalizedMessage());
                    }
    
                    @Override
                    public void onNext(String t) {
                        System.out.println("onNext: " + t);
                    }
                });
    }
    

    使用main以上的getEventsOnSubscribe1功能和getEventsSyncOnSubscribe都会调用订阅者onError,但他们会暂停程序。使用包裹异常的getEventsOnSubscribe2并手动调用s.onError,程序可以退出。

0 个答案:

没有答案