Как завершить работу приложения внутри оператора карты RxJava - PullRequest
0 голосов
/ 04 октября 2019

Когда, например, возникает исключение NullPointerException после вызова оператора карты RxJava, приложение не падает. Я хочу, чтобы приложение аварийно завершало работу, когда это происходит, поэтому оно может отправлять отчеты об ошибках и т. Д.

Я пытался использовать Exceptions.propagate() в блоке try / catch, но это не сработало.

Единственное решение, которое я нашел, это добавление RuntimeException в мой обработчик ошибок.

    override fun getCategories(): Single<List<Category>> {
        return ApiManager
                .getCategoriesService()
                .getCategories()
                .map { categoriesResponse ->
                        throw KotlinNullPointerException
                        categoriesResponse.categories?.map { categoryResponse ->
                            CategoryMapper().mapFromRemote(categoryResponse)
                        }
                }
    }

Исключение NullPointerException, выброшенное внутри оператора карты, не приводит к сбою приложения. Если я вызываю его перед оператором return, приложение вылетает.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Если я вызываю его перед оператором return, это приводит к сбою приложения.

Сбой, потому что в главном потоке Android выполняется метод getCategories для построения цепочки rx.

Исключение NullPointerException, генерируемое в операторе карты, не приводит к сбою приложения.

Это не приводит к сбою приложения, поскольку эта цепочка подписывается на поток, который не является основным потоком Android,Например, ваша цепочка имеет .subscribeOn(Schedulers.io()).

Единственное решение, которое я нашел, - это генерирование RuntimeException в моем обработчике ошибок.

Это ожидаемый дизайн вашей цепочки согласноэтот документ :

Observable обычно не генерирует исключения. Вместо этого он уведомляет любых наблюдателей о том, что возникла неисправимая ошибка, завершив последовательность Observable уведомлением onError.

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

0 голосов
/ 07 октября 2019

Хорошо, так что я думаю, что ближе всего к тому, чего я хочу достичь, это вызвать Exceptions.propagate(throwable) в обработчике ошибок, вызванном в onError. Спасибо, что указали мне правильное направление @Gustavo @ TooManyEduardos2

...