Как указано в комментариях к вопросу, мне приходилось сталкиваться с подобной проблемой.Наша проблема была в нашем приложении для Android.Сетевые вызовы могут занять слишком много времени, и пользователи отправят приложение в фоновый режим.Когда это происходит, мы избавляемся от подписок.Когда происходит тайм-аут сокета, никто не прослушивает исключение, и это вызывает UndeliverableException
.
Мы заменили обработчик ошибок по умолчанию на (он в kotlin, я надеюсь, что это нормально):
private object DefaultErrorHandler : Consumer<Throwable> {
override fun accept(t: Throwable) {
when (t) {
is UndeliverableException -> accept(t.cause!!)
is NullPointerException,
is IllegalArgumentException -> Thread.currentThread().run {
uncaughtExceptionHandler.uncaughtException(this, t)
}
else -> // Swallow the exception here. We logged it to Crashlytics...
}
}
}
val defaultErrorHandler: Consumer<Throwable> = DefaultErrorHandler
// Then on application start we would replace the error handler
RxJavaPlugins.setErrorHandler(defaultErrorHandler)
Я почти уверен, defaultErrorHandler
это ужасное имя.Извините за это.
Немного объяснений.Исключения, которые мы не проглатываем, это NullPointerException
и IllegalArgumentException
.Они передаются обработчику неперехваченных исключений текущего потока.Мы сделали это, потому что они обычно связаны с ошибками программирования.
Мы проверяем на UndeliverableExceptions
и разворачиваем их, чтобы снова выполнить через того же потребителя.Это просто для того, чтобы убедиться, что мы используем правильную логику для исключения, которое не может быть доставлено.
Все остальные исключения проглатываются и регистрируются в аварийных ситуациях для дальнейшей оценки.
Одна ключевая вещь,это работает для наших случаев использования.Возможно, вам нужно адаптировать его к вашему.Я не говорю, что это лучший способ сделать это.Это пример.Возможно, вы хотите просто игнорировать время ожидания сокета.