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” 문자열을 출력합니다.