Unat
Это тебе тут посоветовали ErrorHandling в Intereceptor делать или сам додумался ?
Тут, к сожалению, но там задумка изначально убитая.
Anonymous
Я подумаю =)
Unat
Короче все равно не ловит. Interceptor
Сделай условие в catch шире, пусть там будет Exception
Unat
посмотри что получится
Anonymous
Это тебе тут посоветовали ErrorHandling в Intereceptor делать или сам додумался ?
Ну да) мы тут пытаеемся поймать TimeOutException. Чтобы не писать в каждом окне обработчик
Chriz
Ты же его всёравно дальше бросаеш
Unat
Да хоть Throwable))
Значит потому я и не делал это в перехватчике, лол
Anonymous
Во поймал
Unat
Там есть ещё addNetworkInterceptor
Chriz
в Rx есть такая фишка .onErrorResumeNext { }
Anonymous
Все спс, расходимся)
Unat
в Rx есть такая фишка .onErrorResumeNext { }
Ему надо бродкаст кинуть с ошибкой
Aleksey
в Rx есть такая фишка .onErrorResumeNext { }
Ты предлагаешь лепить это во все запросы?)
Chriz
.onErrorResumeNext(errorHandler::resolveError)
Chriz
+1 строка к каждому запросу
Chriz
а бродкастить в интерсепторе лучше ?
Aleksey
Интересно, что ты планируешь возвращать из такого хендлера
Chriz
Так хотябы утечек не будет
Aleksey
А утечкам откуда взяться?
Chriz
Интересно, что ты планируешь возвращать из такого хендлера
Maybe.empty() если TimeOut . Maybe.error если чтото другое
Aleksey
Maybe.empty() если TimeOut . Maybe.error если чтото другое
Ну такое. Если есть базовый набор ошибок, я бы лучше на UI обработчик вешал
Aleksey
А не через всякие там шины пробрасывал события показа чего-либо
Chriz
в resolveError eщё можно групировать в CustomException если у них эфект одинаковый будет. Зачем в каждом .subscribe делать большой when блок ?
Chriz
В одном проэкте у нас в нём был еще context чтобы показывать тоасты при некоторых ошибок.
Chriz
Например в соединении много ошибок. Если проблема в этом то можно вернуть кастомный NetworkException()
Aleksey
Ура, добавляем ErrorHandler в качестве зависимости во все репозитории/презентеры 🎉
Aleksey
Ну такое. Лучше, чем when в каждой подписке, но все равно не очень.
Chriz
репозитория обычно одна, так что проблемой не будет. Ну если их там просто дофига, что ответ не подойдёт
Chriz
А вот в текущем проэкте, у нас RxCallAdapteryFactoryWrapper и всё там
Chriz
При ошибке нам сервер отправлает коды и текст который нужно показать, мы body из Exception конвертируем в ErrorModel, и отправляем внутри Exception
Chriz
Почему там ?
Chriz
Interceptor то что стоит по середине, Adapter это когда ответ есть и нужно обработать
Aleksey
Почему там ?
Потому что это место, у которого есть доступ к запросу, самый низкий уровень CallAdapter должен работа ь с трансформацией OkHttp Call в нужные - Rx, Coroutine и тд
Chriz
Interceptor мы используем для oAuth, Language, и проверяем Connection Перед запросом
Aleksey
Можно пост-обработку делать
Chriz
Есть, но это не значит что нужно там использовать
Aleksey
Есть, но это не значит что нужно там использовать
Но и не значит, что в RxJavaCallAdapter’e)))
Chriz
Почему ? конвертить ответ в желаемую модэль задача для CallAdapter ? У нас она этим и занимается
Chriz
ах
Chriz
это ещё не всё
Chriz
каждый Api могут иметь разные ответы error, мы пользуемя потациями чтобы сказать какая модель нужна
Chriz
в интерсепторе нету доступа к нотациям DAO
Aleksey
в интерсепторе нету доступа к нотациям DAO
В перемешку всякое разное смешали
Chriz
Неправельно написал, каждый метод имеет разные ответы
Chriz
@ErrorType(CatError::class) getCats(): Maybe<Cats>
Aleksey
@ErrorType(CatError::class) getCats(): Maybe<Cats>
Ура, больше аннотаций богу аннотаций
Chriz
Предлагаеш для каждого метода создать собвственный webservice с разными интеспторами ?
Aleksey
Интересно, как выглядит адаптер - куча if-else?
Chriz
интерсепторами*
Aleksey
Всё ещё не нужны аннотации
Aleksey
ты это а чём ?
Это я о том, как он решает, как обработать класс ошибки и какие из него достать поля
Chriz
используем Gson чтобы сконвертить json ответ в класс который находится в аннотации - 2 строки всего
Aleksey
У тебя есть CatError, DogError Как понять, какие у кого поля? Ты же не можешь в onNext кинуть два разных типа
Chriz
Возвращаем его в onError
Chriz
где ему и место ))
Aleksey
И в чём профит тогда? Там снова нужно кастить
Chriz
Это происходит автоматом, у нас же не 1 error может случится.
Aleksey
А сколько? Контракт Rx таков, что только один error на цепь.
Chriz
Я всмысле много разных Exception
Aleksey
Автоматом в UI Throwable превращается в CatError?
Chriz
ConnectionException, MapException, ResponseException
Aleksey
А почему тогда не Converter, а CallAdapter?)
Aleksey
Кажется, в Converter этому самое место
Chriz
when(throwable) is ResponseException -> { showError((throwable.response as CatError).text) } is ConnectionException -> doBlabla is MapException -> doBoBoBo
Chriz
чтото такое в итоге