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))) ...