У меня есть подкласс исключения для каждого важного ответа на сбой. Исключения доставляются как Observable.error()
, а значения доставляются через поток без какой-либо упаковки.
1) Нет интернета - ConnectionException
2) Null - просто NullPointerException
4) Проверьте "неверный запрос" и выбросите IncorrectLoginPasswordException.
5) любая другая ошибка - это просто исключение NetworkException
Вы можете сопоставить ошибки с onErrorResumeNext()
и map()
Например
Типичный метод модернизации, который извлекает данные из веб-службы:
public Observable<List<Bill>> getBills() {
return mainWebService.getBills()
.doOnNext(this::assertIsResponseSuccessful)
.onErrorResumeNext(transformIOExceptionIntoConnectionException());
}
Метод, который гарантирует, что ответ в порядке, в противном случае выдает соответствующие исключения
private void assertIsResponseSuccessful(Response response) {
if (!response.isSuccessful() || response.body() == null) {
int code = response.code();
switch (code) {
case 403:
throw new ForbiddenException();
case 500:
case 502:
throw new InternalServerError();
default:
throw new NetworkException(response.message(), response.code());
}
}
}
IOException означает, что нет сетевого подключения, поэтому я выбрасываю ConnectionException
private <T> Function<Throwable, Observable<T>> transformIOExceptionIntoConnectionException() {
// if error is IOException then transform it into ConnectionException
return t -> t instanceof IOException ? Observable.error(new ConnectionException(t.getMessage())) : Observable.error(
t);
}
Для вашего запроса на вход создайте новый метод, который будет проверять, в порядке ли логин / пароль.
И в конце есть
subscribe(okResponse -> {}, error -> {
// handle error
});
person
Tuby
schedule
10.08.2018