Как я могу иметь общий doOnError после специфичных для класса исключений в Reactor - PullRequest
0 голосов
/ 09 октября 2018

Такое ощущение, что это должно быть просто, поэтому я могу упустить что-то очевидное.У меня есть простой пример случая, когда у меня есть ошибка Mono, и я хотел бы иметь специфичную для класса исключения обработку с универсальным обработчиком.

    Mono.error(new RuntimeException())
            .doOnError(RuntimeException.class, e -> System.out.println("Caught RuntimeException"))
            .doOnError(Throwable.class, e -> System.out.println("Caught Throwable"))
            .block();

output: Caught RuntimeException
        Caught Throwable

Проблема состоит в том, что оба потребителя будут вызваны (тот, у которогоRuntimeException и общий с Throwable).Есть ли (чистый) способ избежать вызова общего, если более конкретный уже был вызван?

1 Ответ

0 голосов
/ 27 октября 2018

Если есть способ восстановления после ошибки, используйте вместо этого функцию onErrorResume .

Mono.error(new RuntimeException())
    .flatMap(k -> callExternalService(k)
        .onErrorResume(RuntimeException.class, this::recoverFromRuntimeExeption)
        .onErrorResume(Throwable.class, this::recoverFromThrowable)
    );

Таким образом, вы измените путь выполнения вашего Mono с ошибки на успехи последующий doOnError не будет вызван.

...