[java] RxJava에서의 비동기 예외 처리

RxJava는 비동기 프로그래밍을 위한 라이브러리로, 일반적인 예외 처리 방식과는 조금 다른 방식을 제공합니다. 이 글에서는 RxJava에서의 비동기 예외 처리에 대해 알아보겠습니다.

1. 에러 처리 연산자

RxJava는 다양한 에러 처리 연산자를 제공하여 비동기 작업 중 발생한 예외를 처리할 수 있습니다. 가장 기본적인 연산자는 onErrorResumeNext 입니다. 이 연산자는 에러가 발생했을 때, 다른 Observable을 구독하여 대체 값을 발행하도록 합니다.

예를 들어서 다음과 같이 코드를 작성할 수 있습니다:

Observable.just("Hello")
    .flatMap(s -> Observable.error(new RuntimeException("Error")))
    .onErrorResumeNext(throwable -> Observable.just("Fallback"))
    .subscribe(System.out::println, System.err::println);

위의 예제에서는 flatMap 오퍼레이터에서 의도적으로 예외를 발생시키고 있습니다. 하지만 onErrorResumeNext 오퍼레이터를 사용하여 예외가 발생하면 “Fallback” 문자열을 대신 발행하도록 처리하고 있습니다.

2. 예외 처리 연산자

RxJava는 예외 처리에 사용할 수 있는 다양한 연산자를 제공합니다. 대표적인 예로 doOnError 연산자가 있습니다. 이 연산자는 에러를 처리하기 전에 어떤 작업을 수행할 때 사용됩니다.

다음 예제에서는 doOnError를 사용하여 에러가 발생했을 때 로그를 출력하는 간단한 예제를 살펴보겠습니다:

Observable.just("Hello")
    .flatMap(s -> Observable.error(new RuntimeException("Error")))
    .doOnError(throwable -> System.err.println("Error occurred: " + throwable.getMessage()))
    .subscribe(System.out::println);

위의 예제에서는 doOnError를 사용하여 에러가 발생하면 해당 에러의 메시지를 로그로 출력하도록 처리하고 있습니다.

3. 성공값과 에러 처리 연산자

RxJava에서는 성공값과 에러를 처리하는 연산자를 함께 사용할 수도 있습니다. 대표적인 예로 onErrorReturn 연산자가 있습니다. 이 연산자는 에러가 발생했을 때 대신 발행할 값을 지정할 수 있습니다.

다음 예제에서는 onErrorReturn을 사용하여 에러가 발생하면 “Fallback” 문자열을 대신 발행하고, 성공적으로 처리되면 그 값을 구독자에게 전달하는 예제입니다:

Observable.just("Hello")
    .flatMap(s -> Observable.error(new RuntimeException("Error")))
    .onErrorReturn(throwable -> "Fallback")
    .subscribe(System.out::println);

위의 예제는 에러가 발생하면 “Fallback” 문자열을 발행하도록 처리하고 있습니다. 에러가 발생하지 않으면 “Hello” 문자열을 출력합니다.

참고 자료