Daykm
Daykm

Reputation: 485

How do I throw an exception in an Observable?

I'm trying to validate data so that I can throw an exception that will be specifically handled by the subscriber's onError, but I can't figure out how to throw the exception. This is current attempt:

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();
            }
        });

This doesn't work because as far as I know, the observable stream must be homogeneous.

Upvotes: 0

Views: 710

Answers (2)

Daykm
Daykm

Reputation: 485

Observable on the flatMap func1 should be 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();
                }
            })

Upvotes: 1

Zsombor Erdődy-Nagy
Zsombor Erdődy-Nagy

Reputation: 16914

You just need to use the plain old Java throw statement there. Exceptions that are not handled within stream operators will be forwarded to the onError block of your subscriber.

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();
        }
    });

Upvotes: 0

Related Questions