package com.github.jhusain.learnrxjava.examples; import rx.Observable; public class ErrorHandlingBasics { public static void main(String... args) { /* * Errors should be emitted via onError */ Observable.create(s -> { s.onError(new RuntimeException("failed")); }).subscribe(System.out::println, t -> System.out.println("1) Error: " + t)); /* * But RxJava trys to do the right thing if an error is thrown */ Observable.create(s -> { throw new RuntimeException("failed"); }).subscribe(System.out::println, t -> System.out.println("2) Error: " + t)); Observable.just("hello").map(s -> { throw new RuntimeException("failed"); }).subscribe(System.out::println, t -> System.out.println("3) Error: " + t)); /* * Conditionals that may return an error can be done in a flatMap */ Observable.just(true).flatMap(v -> { if (v) { return Observable.error(new RuntimeException("failed")); } else { return Observable.just("data", "here"); } }).subscribe(System.out::println, t -> System.out.println("4) Error: " + t)); /* * Errors can be handled on any Observable */ Observable.error(new RuntimeException("failed")) .onErrorResumeNext(Observable.just("5) data")) .subscribe(System.out::println, t -> System.out.println("5) Error: " + t)); /* * Or the Throwable can be obtained to do conditional logic */ Observable.error(new IllegalStateException("failed")) .onErrorResumeNext(t -> { if (t instanceof IllegalStateException) { return Observable.error(t); } else { return Observable.just("6) data"); } }) .subscribe(System.out::println, t -> System.out.println("6) Error: " + t)); Observable.error(new RuntimeException("failed")) .onErrorResumeNext(t -> { if (t instanceof IllegalStateException) { return Observable.error(t); } else { return Observable.just("7) data"); } }) .subscribe(System.out::println, t -> System.out.println("7) Error: " + t)); } }