RxJava: Могу ли я перехватить все ошибки перед передачей в onError? - PullRequest
0 голосов
/ 14 декабря 2018

Допустим, у меня есть поток, выполняющий опасную операцию:

void main() {
    Observable.just(1)
            .doOnNext(integer -> dangerousOperation())
            .subscribe(
                    integer -> {
                        // TODO
                    },
                    error -> {
                        if (error instanceof ExceptionA) {
                            // recover gracefully
                        }
                    });
}

void dangerousOperation() {
    throw new ExceptionA();
}

Допустим, я выполняю эту опасную операцию во многих местах своего приложения.В каждом потоке я добавил некоторый код восстановления, свойственный каждому потоку.

Теперь мне нужно добавить новую ошибку в мою опасную операцию:

void dangerousOperation() {
    Random random = new Random();
    if (random.nextBoolean()) {
        throw new ExceptionA();
    } else {
        throw new ExceptionB();
    }
}

Кроме того, я хочу восстановить изExceptionB одинаково везде .Другими словами, я хочу обработать ExceptionA специфичным для потока способом и обработать ExceptionB глобальным способом.

Есть ли способ, которым я могу "перехватить" ошибку в каждый поток RxJava до передается в обработчик ошибок? ++

Если я обработаю ExceptionB в каждой onError, то я дублирую много кода.Если я удаляю блок onError из каждого потока целиком и полагаюсь только на глобальный RxJavaPlugins.setErrorHandler(), я не смогу обработать ExceptionA специфичным для потока способом.


++ илиеще лучше, не передаваться обработчику ошибок, специфичному для потока, и вместо этого избавляться от потока.

1 Ответ

0 голосов
/ 14 декабря 2018

Как насчет написания функции, которая обрабатывает реализации глобальной ошибки, а затем возвращает статус, если она обработала ошибку.Затем со статусом вы можете перейти к другим случаям исключений.

 boolean handleException(Exception error) {
     if (error instanceof ExceptionB) {
         // handle the global exception here
         return true;
     }
     return false;
 }

Теперь из каждой реализации ошибки потока вы можете вызывать вышеуказанную функцию для обработки глобальных ошибок

 error -> {
       if (!handleException(error) {
              // handle the other specific cases here
       }
 });
...