如何在Observable中抛出异常?

时间:2016-08-26 16:15:49

标签: android rx-java rx-android

我试图验证数据,以便我可以抛出一个由订阅者的onError专门处理的异常,但我无法弄清楚如何抛出异常。这是当前的尝试:

Realm.getDefaultInstance()
        .asObservable()
        .map(new Func1<Realm, RealmResults<NewsFeed>>() {
            @Override
            public RealmResults<NewsFeed> call(Realm realm) {
                return realm.where(NewsFeed.class).findAll();
            }
        })
        .flatMap(new Func1<RealmResults<NewsFeed>, Observable<?>>() {
            @Override
            public Observable<?> call(RealmResults<NewsFeed> newsFeed) {
                if(newsFeed.size() == 0) {
                    // can't do this
                    return Observable.error(new NoDataException());
                }
                return newsFeed.first().asObservable();
            }
        });

这不起作用,因为据我所知,可观察流必须是同质的。

2 个答案:

答案 0 :(得分:1)

flatMap func1上的Observable应该是Observable。

    Realm.getDefaultInstance()
            .asObservable()
            .map(new Func1<Realm, RealmResults<NewsFeed>>() {
                @Override
                public RealmResults<NewsFeed> call(Realm realm) {
                    return realm.where(NewsFeed.class).findAll();
                }
            })
            .flatMap(new Func1<RealmResults<NewsFeed>, Observable<NewsFeed>>() {
                @Override
                public Observable<NewsFeed> call(RealmResults<NewsFeed> newsFeed) {
                    if(newsFeed.size() == 0) {
                        return Observable.error(new NoDataException());
                    }
                    return newsFeed.first().asObservable();
                }
            })

答案 1 :(得分:0)

您只需要在那里使用普通的旧Java throw语句。在流操作符中未处理的异常将被转发到订阅者的onError块。

Realm.getDefaultInstance()
    .asObservable()
    .map(new Func1<Realm, RealmResults<NewsFeed>>() {
        @Override
        public RealmResults<NewsFeed> call(Realm realm) {
            return realm.where(NewsFeed.class).findAll();
        }
    })
    .flatMap(new Func1<RealmResults<NewsFeed>, Observable<?>>() {
        @Override
        public Observable<?> call(RealmResults<NewsFeed> newsFeed) {
            if(newsFeed.size() == 0) {
                throw new NoDataException();
            }
            return newsFeed.first().asObservable();
        }
    });