RxJava OnError jak ładnie radzić sobie z różnymi wyjątkami

0

Cześć.
@Koziołek, @Shalom, @panryz

sorry że Was tak z imienia ale może będzie szybciej :P.

Mam następującą zagwozdkę. Otóż w Rx owej konstrukcji strumienia po iluś tam mapach, filtrach i diaboł wie czego jeszcze, dochodzimy do naszej subsrkrybcji i tam widnieje nam piękne onError.

no i elegancko się z nim rozprawiamy.

Tylko moment. A skąd wiemy jaki to error? A no właśnie nie wiemy.

No to co zrobić żeby sprawdzić czy to jakiś nullPointer, HttpError czy jeszcze jakieś inne cholerstwo co się nam po drodze napatoczyło?

No niestety jedyne przykłady znalezione w necie oferują instanceOf jako rozwiązanie, co jest po pierwsze brzydkie a po drugie jest bardzo brzydkie.

dlatego może jakiś fajny pomysł jak to sensownie zrobić? Mi jedyne co przyszło do głowy to zrobienie takiego koszmarka

public interface ErrorHandler {
    void handleError(Exception e);
    void handleError(HttpException e);
    void handleError(NullPointerException npe);
   //i tu dokladanie nastepnych w zaleznosci ile chcemy obsłużyć. Ale to strasznie bleh jest też
}

i wrzucenie go wesoło do łańcucha i niech ten interfejs się martwi jaki error obsługuje

i zamiast tego

model.provideObservable()
                .subscribe(loginResponse -> {
                            view.onLoginResponse();
                        },throwable -> {
                            if (throwable instanceof HttpException) {
                               // tutaj zrob cos jak http exception
                            } else {
                                // tutaj zrob cos jak nie http exception
                            }
                        });

mieć coś takiego:

model.provideObservable()
                .subscribe(loginResponse -> {
                            view.onLoginResponse();
                        },throwable -> {
                            errorHandler.handleError(throwable);
                        });
1

Zawsze możesz rzucić tego throwable a potem matchować za pomocą catch ;) Plus taki ze będziesz mógł sobie robić jakieś catch(Ex1 | Ex2 | Ex3 e) jeśli handlowanie jest takie samo.

2

@Shalom nie mam ochoty się z Tobą dzisiaj kłócić ani obrażać :/ może jutro się pobawimy.

o tak. Myślałem że może jest jakiś sprytny mechanizm zaszyty w RXie do którego się nie dokopałem -

wątpię

Na szybko to bym to zrobił tak:

model.provideObservable()
    .subscribe(loginResponse -> {
                view.onLoginResponse();
            },throwable -> 
            {
               try {
                   throw e;
               } catch (HttpException ex) {
                  // dwiem co jem
               } catch (Exception ex) {
                  // pupablada
               }
            }

EDIT

ale, zamiast tego wolałbym reagować, zaraz po metodzie z której wiem że coś może polecieć, używając doOnError

2

Java nie ma pattern matchingu w inny sposób niż przez takie potworki. Jednak jeżeli nie boli cię dołączenie czegoś to napisz sobie maleństwo w Kotlinie, który ma już jakiś tam prosty pattern matching:

fun errorHandler(e:Exception){

    when(e){
        e is NullPointer ->
        e is BussinesEx ->
        else ->   
   }
}

Przynajmniej będzie lepiej wyglądać.

0

hyh Dzięki Panowie za podpowiedzi. Cenne :)

zostawię otwarty temat, może ktoś będzie chciał się jeszcze wypowiedzieć :D

pzdr

1 użytkowników online, w tym zalogowanych: 0, gości: 1