Как отловить ошибку cra sh результата фазы onNext для rx-цепи? - PullRequest
0 голосов
/ 06 мая 2020

Когда у меня есть поток ниже, где cra sh произойдет в doSomethingThatWillCrash(), я показал, что он будет пойман в { error -> showError(error.message }, но это не так, поскольку он уже находится на этапе подписки onNext

    disposable = apiRepository.fetch()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            { result -> doSomethingThatWillCrash() },
            { error -> showError(error.message }
        )

Как мне справиться с ошибкой?

Я могу

try {
    disposable = apiRepository.fetch()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            { result -> doSomethingThatWillCrash() },
            { error -> showError(error.message }
        )
} catch(e:Exception) { }

или

    disposable = apiRepository.fetch()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            { result -> try { doSomethingThatWillCrash() } catch(e:Exception) { } },
            { error -> showError(error.message }
        )

Но это уродливо ... Любое рекомендация?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Как насчет распространения вашей ошибки в блок onError:

disposable = apiRepository.fetch()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnSuccess { doSomethingThatWillCrash() }
    .subscribe({ result ->
        // nothing to do now
    }, { error ->
        // handle all errors including one from fun `doSomethingThatWillCrash()`
        showError(error.message)
    })

Не уверен, возвращает ли apiRespository.fetch() Single. Если нет, используйте правильный оператор Rx на основе вашего типа возвращаемого значения, например .doOnNext() для Observable et c.

0 голосов
/ 07 мая 2020

Один из способов - зарегистрировать setErrorHandler, как показано ниже

    RxJavaPlugins.setErrorHandler { error -> showError(error.message) }

    disposable = apiRepository.fetch()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            { result -> doSomethingThatWillCrash() },
            { error -> showError(error.message) }
        )

В соответствии с общим для InterruptedException не обнаружено на Rx Java обратный вызов onError?

...