Я использую Retrofit
с RxJava
для сетевых вызовов и RxBinding
для просмотра операций. На экране регистрации при нажатии кнопки «Регистрация» я отправляю информацию на локальный сервер, используя службу MyApi
.Как обрабатывать `IllegalArgumentException` в RxJava?
SignupActivity.class
mCompositeSubscription.add(RxView.clicks(mRegisterButton).debounce(300, TimeUnit.MILLISECONDS).
subscribe(view -> {
registerUser();
}, e -> {
Timber.e(e, "RxView ");
onRegistrationFailed(e.getMessage());
}));
private void registerUser() {
mCompositeSubscription.add(api.registerUser(mEmail,
mPassword, mConfirmPassword)
.subscribe(user -> {
Timber.d("Received user object. Id: " + user.getUserId());
}, e -> {
Timber.e(e, "registerUser() ");
onRegistrationFailed(e.getMessage());
}));
}
MyApi.class
public Observable<User> registerUser(String username, String password, String confirmPassword) {
return mService.registerUser(username, password, confirmPassword)
.compose(applySchedulers());
}
@SuppressWarnings("unchecked") <T> Observable.Transformer<T, T> applySchedulers() {
return observable -> observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
MyService.class
@FormUrlEncoded @POST("users/")
Observable<User> registerUser(@Path("email") String username,
@Path("password") String password, @Path("password_confirmation") String confirmPassword);
Вызов с IllegalArgumentException
, поскольку я отправляю неверную информацию.
Что моя главная проблема, на IllegalArgumentException
я думал RxJava
будет выполнять registerUser()#ErrorHandler()
, так как мой registerUser
вызов службы не удалось, за исключением, но вместо этого он вызывает RxView#ErrorHandler()
.
Как я могу заставить/заставлять registerUser()#ErrorHandler()
заботиться об исключении, возникшем во время сетевого вызова?
Что такое StackTrace за исключением. Возможно, это происходит до того, как RxJava будет задействован. – akarnokd
Какой тип "e"? Может быть, это недостаточно для того, чтобы поймать все исключения? – Yoshkebab