A very important aspect of building reliable applications is knowing what to do when things go wrong. It is naive to assume that the network is reliable, that hardware won't fail, or that we, as developers, won't make mistakes.
RxJava embraces this fact and provides a rich set of combinators to deal with failure, a few of which we examine here.
Let's get started by creating a badly behaved observable that always throws an exception:
(defn exceptional-obs [] (rx/observable* (fn [observer] (rx/on-next observer (throw (Exception. "Oops. Something went wrong"))) (rx/on-completed observer))))
Now let's watch what happens if we subscribe to it:
(rx/subscribe (->> (exceptional-obs) (rx/map inc)) (fn [v] (prn-to-repl "result is " v))) ;; Exception Oops. Something went wrong rx-playground.core/exceptional-obs/fn--1505
The exception thrown by exceptional-obs
isn't caught anywhere so it simply bubbles up to the REPL. If this was...